[launchd-changes] [23075] trunk/launchd/src

source_changes at macosforge.org source_changes at macosforge.org
Thu Feb 15 18:51:55 PST 2007


Revision: 23075
          http://trac.macosforge.org/projects/launchd/changeset/23075
Author:   zarzycki at apple.com
Date:     2007-02-15 18:51:55 -0800 (Thu, 15 Feb 2007)

Log Message:
-----------
Remove the "gc_this_jobmgr" hack and other cleanup.

Modified Paths:
--------------
    trunk/launchd/src/launchd_core_logic.c
    trunk/launchd/src/launchd_core_logic.h
    trunk/launchd/src/launchd_runtime.c
    trunk/launchd/src/protocol_job.defs

Modified: trunk/launchd/src/launchd_core_logic.c
===================================================================
--- trunk/launchd/src/launchd_core_logic.c	2007-02-15 22:21:08 UTC (rev 23074)
+++ trunk/launchd/src/launchd_core_logic.c	2007-02-16 02:51:55 UTC (rev 23075)
@@ -204,7 +204,7 @@
 	char *jm_stderr;
 	int reboot_flags;
 	unsigned int global_on_demand_cnt;
-	unsigned int transfer_bstrap:1, sent_stop_to_hopeful_jobs:1, shutting_down:1;
+	unsigned int sent_stop_to_hopeful_jobs:1, shutting_down:1;
 	char name[0];
 };
 
@@ -213,14 +213,13 @@
 
 static jobmgr_t jobmgr_new(jobmgr_t jm, mach_port_t requestorport, mach_port_t checkin_port);
 static jobmgr_t jobmgr_parent(jobmgr_t jm);
-static jobmgr_t jobmgr_tickle(jobmgr_t jm);
+static jobmgr_t jobmgr_do_garbage_collection(jobmgr_t jm);
 static bool jobmgr_is_idle(jobmgr_t jm);
 static void jobmgr_log_stray_children(jobmgr_t jm);
 static void jobmgr_remove(jobmgr_t jm);
 static void jobmgr_dispatch_all(jobmgr_t jm);
 static job_t jobmgr_new_anonymous(jobmgr_t jm);
 static job_t job_mig_intran2(jobmgr_t jm, mach_port_t p);
-static mach_port_t jobmgr_get_reqport(jobmgr_t jm);
 static void job_export_all2(jobmgr_t jm, launch_data_t where);
 static pid_t jobmgr_fork(jobmgr_t jm);
 static void jobmgr_setup_env_from_other_jobs(jobmgr_t jm);
@@ -353,7 +352,6 @@
 static int dir_has_files(job_t j, const char *path);
 static char **mach_cmd2argv(const char *string);
 jobmgr_t root_jobmgr;
-jobmgr_t gc_this_jobmgr;
 
 void
 job_ignore(job_t j)
@@ -526,6 +524,8 @@
 
 	jobmgr_log(jm, LOG_DEBUG, "Beginning job manager shutdown");
 
+	jm->shutting_down = true;
+
 	SLIST_FOREACH_SAFE(jmi, &jm->submgrs, sle, jmn) {
 		jobmgr_shutdown(jmi);
 	}
@@ -538,9 +538,7 @@
 		}
 	}
 
-	jm->shutting_down = true;
-
-	return jobmgr_tickle(jm);
+	return jobmgr_do_garbage_collection(jm);
 }
 
 void
@@ -559,7 +557,12 @@
 
 	/* We should have one job left and it should be the anonymous job */
 	ji = TAILQ_FIRST(&jm->jobs);
-	jobmgr_assumes(jm, ji && ji == jm->anonj && (TAILQ_NEXT(ji, sle) == NULL));
+	if (!(jobmgr_assumes(jm, ji != NULL) && jobmgr_assumes(jm, ji == jm->anonj)
+				&& jobmgr_assumes(jm, TAILQ_NEXT(ji, sle) == NULL))) {
+		TAILQ_FOREACH(ji, &jm->jobs, sle) {
+			job_log(ji, LOG_ERR, "Still remaining at removal.");
+		}
+	}
 
 	while ((ji = TAILQ_FIRST(&jm->jobs))) {
 		job_remove(ji);
@@ -570,11 +573,7 @@
 	}
 
 	if (jm->jm_port) {
-		if (jm->transfer_bstrap) {
-			jobmgr_assumes(jm, launchd_mport_deallocate(jm->jm_port) == KERN_SUCCESS);
-		} else {
-			jobmgr_assumes(jm, launchd_mport_close_recv(jm->jm_port) == KERN_SUCCESS);
-		}
+		jobmgr_assumes(jm, launchd_mport_close_recv(jm->jm_port) == KERN_SUCCESS);
 	}
 
 	if (jm->jm_stdout) {
@@ -587,7 +586,6 @@
 
 	if (jm->parentmgr) {
 		SLIST_REMOVE(&jm->parentmgr->submgrs, jm, jobmgr_s, sle);
-		jobmgr_tickle(jm->parentmgr);
 	} else if (getpid() == 1) {
 		jobmgr_assumes(jm,  reboot(jm->reboot_flags) != -1);
 	} else {
@@ -695,7 +693,6 @@
 
 	if (job_assumes(j, j->mgr)) {
 		TAILQ_REMOVE(&j->mgr->jobs, j, sle);
-		jobmgr_tickle(j->mgr);
 	}
 
 	job_log(j, LOG_DEBUG, "Removed");
@@ -1814,6 +1811,10 @@
 	if (fflags & NOTE_EXIT) {
 		job_reap(j);
 		job_dispatch(j, false);
+
+		if (launchd_assumes(root_jobmgr != NULL)) {
+			root_jobmgr = jobmgr_do_garbage_collection(root_jobmgr);
+		}
 	}
 }
 
@@ -3247,32 +3248,45 @@
 }
 
 jobmgr_t
-jobmgr_tickle(jobmgr_t jm)
+jobmgr_do_garbage_collection(jobmgr_t jm)
 {
+	jobmgr_t jmi, jmn;
 	job_t ji;
 
-	if (jm->sent_stop_to_hopeful_jobs || !jm->shutting_down) {
+	SLIST_FOREACH_SAFE(jmi, &jm->submgrs, sle, jmn) {
+		jobmgr_do_garbage_collection(jmi);
+	}
+
+	if (!jm->shutting_down) {
 		return jm;
 	}
 
+	jobmgr_log(jm, LOG_DEBUG, "Garbage collecting.");
+
+	if (jobmgr_is_idle(jm)) {
+		jobmgr_log_stray_children(jm);
+		jobmgr_remove(jm);
+		return NULL;
+	}
+
+	if (jm->sent_stop_to_hopeful_jobs) {
+		return jm;
+	}
+
 	TAILQ_FOREACH(ji, &jm->jobs, sle) {
 		if (ji->p && !ji->hopefully_exits_last) {
 			return jm;
 		}
 	}
 
+	jobmgr_log(jm, LOG_DEBUG, "Asking \"hopeful\" jobs to exit.");
+
 	TAILQ_FOREACH(ji, &jm->jobs, sle) {
 		job_stop(ji);
 	}
 
 	jm->sent_stop_to_hopeful_jobs = true;
 
-	if (jobmgr_is_idle(jm)) {
-		jobmgr_log_stray_children(jm);
-		jobmgr_remove(jm);
-		return NULL;
-	}
-
 	return jm;
 }
 
@@ -3461,7 +3475,7 @@
 	return NULL;
 }
 
-void
+jobmgr_t
 jobmgr_delete_anything_with_port(jobmgr_t jm, mach_port_t port)
 {
 	struct machservice *ms, *next_ms;
@@ -3478,10 +3492,6 @@
 	 * to use.
 	 */
 
-	if (jm->req_port == port) {
-		jobmgr_shutdown(jm);
-	}
-
 	SLIST_FOREACH_SAFE(jmi, &jm->submgrs, sle, jmn) {
 		jobmgr_delete_anything_with_port(jmi, port);
 	}
@@ -3493,6 +3503,12 @@
 			}
 		}
 	}
+
+	if (jm->req_port == port) {
+		return jobmgr_shutdown(jm);
+	}
+
+	return jm;
 }
 
 struct machservice *
@@ -3688,15 +3704,6 @@
 	job_dispatch(j, false);
 }
 
-mach_port_t
-jobmgr_get_reqport(jobmgr_t jm)
-{
-	jm->transfer_bstrap = true;
-	gc_this_jobmgr = jm;
-
-	return jm->req_port;
-}
-
 jobmgr_t 
 job_get_bs(job_t j)
 {
@@ -4609,6 +4616,8 @@
 	SLIST_FOREACH(ms, &j->machservices, sle) {
 		strlcpy(service_names[cnt2], machservice_name(ms), sizeof(service_names[0]));
 		ports[cnt2] = machservice_port(ms);
+		/* Increment the send right by one so we can shutdown the jobmgr cleanly */
+		jobmgr_assumes(jm, (errno = mach_port_mod_refs(mach_task_self(), ports[cnt2], MACH_PORT_RIGHT_SEND, 1)) == 0);
 		cnt2++;
 	}
 
@@ -4618,12 +4627,13 @@
 	*portsp = ports;
 	*servicenames_cnt = *ports_cnt = cnt;
 
-	*reqport = jobmgr_get_reqport(jm);
+	*reqport = jm->req_port;
 	*rcvright = jm->jm_port;
 
-	launchd_assumes(runtime_remove_mport(*rcvright) == KERN_SUCCESS);
+	jm->req_port = 0;
+	jm->jm_port = 0;
 
-	launchd_assumes(launchd_mport_make_send(*rcvright) == KERN_SUCCESS);
+	jobmgr_shutdown(jm);
 
 	return BOOTSTRAP_SUCCESS;
 

Modified: trunk/launchd/src/launchd_core_logic.h
===================================================================
--- trunk/launchd/src/launchd_core_logic.h	2007-02-15 22:21:08 UTC (rev 23074)
+++ trunk/launchd/src/launchd_core_logic.h	2007-02-16 02:51:55 UTC (rev 23075)
@@ -27,14 +27,13 @@
 typedef struct jobmgr_s *jobmgr_t;
 
 extern jobmgr_t root_jobmgr;
-extern jobmgr_t gc_this_jobmgr;
 
 void jobmgr_set_stdout(jobmgr_t jm, const char *what);
 void jobmgr_set_stderr(jobmgr_t jm, const char *what);
 jobmgr_t jobmgr_shutdown(jobmgr_t jm);
 void jobmgr_dispatch_all_semaphores(jobmgr_t jm);
 job_t jobmgr_find(jobmgr_t jm, const char *label);
-void jobmgr_delete_anything_with_port(jobmgr_t jm, mach_port_t port);
+jobmgr_t jobmgr_delete_anything_with_port(jobmgr_t jm, mach_port_t port);
 bool jobmgr_ack_port_destruction(jobmgr_t jm, mach_port_t p);
 job_t jobmgr_find_by_service_port(jobmgr_t jm, mach_port_t p);
 

Modified: trunk/launchd/src/launchd_runtime.c
===================================================================
--- trunk/launchd/src/launchd_runtime.c	2007-02-15 22:21:08 UTC (rev 23074)
+++ trunk/launchd/src/launchd_runtime.c	2007-02-16 02:51:55 UTC (rev 23075)
@@ -659,7 +659,9 @@
 		inherited_bootstrap_port = MACH_PORT_NULL;
 	}
 
-	jobmgr_delete_anything_with_port(root_jobmgr, name);
+	if (launchd_assumes(root_jobmgr != NULL)) {
+		root_jobmgr = jobmgr_delete_anything_with_port(root_jobmgr, name);
+	}
 
 	/* A dead-name notification about a port appears to increment the
 	 * rights on said port. Let's deallocate it so that we don't leak
@@ -760,12 +762,6 @@
 		bufRequest = bufReply;
 		bufReply = bufTemp;
 
-		/* XXX - So very gross */
-		if (gc_this_jobmgr) {
-			jobmgr_shutdown(gc_this_jobmgr);
-			gc_this_jobmgr = NULL;
-		}
-
 		if (!(tmp_options & MACH_RCV_MSG)) {
 			continue;
 		}

Modified: trunk/launchd/src/protocol_job.defs
===================================================================
--- trunk/launchd/src/protocol_job.defs	2007-02-15 22:21:08 UTC (rev 23074)
+++ trunk/launchd/src/protocol_job.defs	2007-02-16 02:51:55 UTC (rev 23075)
@@ -31,6 +31,10 @@
 import "libvproc_public.h";
 import "libvproc_internal.h";
 
+type mach_port_move_send_array_t = array[] of mach_port_move_send_t
+		ctype: mach_port_array_t;
+
+
 userprefix vproc_mig_;
 serverprefix job_mig_;
 
@@ -85,10 +89,10 @@
 
 routine take_subset(
 		__bs_port	: job_t;
-	out	__bs_reqport	: mach_port_t;
+	out	__bs_reqport	: mach_port_move_send_t;
 	out	__bs_rcvright	: mach_port_move_receive_t;
 	out	__service_names	: name_array_t, dealloc;
-	out	__service_ports	: mach_port_array_t, dealloc);
+	out	__service_ports	: mach_port_move_send_array_t, dealloc);
 
 routine getsocket(
 		__bs_port	: job_t;

-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.macosforge.org/pipermail/launchd-changes/attachments/20070215/58cc5421/attachment.html


More information about the launchd-changes mailing list