[launchd-changes] [23907] trunk/launchd/src/launchd_core_logic.c

source_changes at macosforge.org source_changes at macosforge.org
Thu Apr 23 18:21:22 PDT 2009


Revision: 23907
          http://trac.macosforge.org/projects/launchd/changeset/23907
Author:   dsorresso at apple.com
Date:     2009-04-23 18:21:21 -0700 (Thu, 23 Apr 2009)
Log Message:
-----------
More complete fix for <rdar://problem/6803005>.

Modified Paths:
--------------
    trunk/launchd/src/launchd_core_logic.c

Modified: trunk/launchd/src/launchd_core_logic.c
===================================================================
--- trunk/launchd/src/launchd_core_logic.c	2009-04-23 20:28:24 UTC (rev 23906)
+++ trunk/launchd/src/launchd_core_logic.c	2009-04-24 01:21:21 UTC (rev 23907)
@@ -372,7 +372,7 @@
 #define jobmgr_assumes(jm, e)	\
 	(unlikely(!(e)) ? jobmgr_log_bug(jm, __LINE__), false : true)
 
-static jobmgr_t jobmgr_new(jobmgr_t jm, mach_port_t requestorport, mach_port_t transfer_port, bool sflag, const char *name, mach_port_t session_port);
+static jobmgr_t jobmgr_new(jobmgr_t jm, mach_port_t requestorport, mach_port_t transfer_port, bool sflag, const char *name, bool no_init, mach_port_t session_port);
 static job_t jobmgr_import2(jobmgr_t jm, launch_data_t pload);
 static jobmgr_t jobmgr_parent(jobmgr_t jm);
 static jobmgr_t jobmgr_do_garbage_collection(jobmgr_t jm);
@@ -5521,14 +5521,14 @@
 jobmgr_t
 jobmgr_do_garbage_collection(jobmgr_t jm)
 {
-	if( !jm->shutting_down ) {
-		return jm;
-	}
-	
 	jobmgr_t jmi = NULL, jmn = NULL;
 	SLIST_FOREACH_SAFE(jmi, &jm->submgrs, sle, jmn) {
 		jobmgr_do_garbage_collection(jmi);
 	}
+
+	if( !jm->shutting_down ) {
+		return jm;
+	}
 	
 	if( SLIST_EMPTY(&jm->submgrs) ) {
 		jobmgr_log(jm, LOG_DEBUG, "No submanagers left.");
@@ -5800,7 +5800,7 @@
 }
 
 jobmgr_t 
-jobmgr_new(jobmgr_t jm, mach_port_t requestorport, mach_port_t transfer_port, bool sflag, const char *name, mach_port_t session_port)
+jobmgr_new(jobmgr_t jm, mach_port_t requestorport, mach_port_t transfer_port, bool sflag, const char *name, bool no_init, mach_port_t session_port)
 {
 	mach_msg_size_t mxmsgsz;
 	job_t bootstrapper = NULL;
@@ -5813,7 +5813,7 @@
 		return NULL;
 	}
 
-	jmr = calloc(1, sizeof(struct jobmgr_s) + (name ? (strlen(name) + 1) : 128));
+	jmr = calloc(1, sizeof(struct jobmgr_s) + (name ? (strlen(name) + 1) : NAME_MAX + 1));
 
 	if (!jobmgr_assumes(jm, jmr != NULL)) {
 		return NULL;
@@ -5884,7 +5884,7 @@
 		jobmgr_assumes(jmr, kevent_mod(0, EVFILT_FS, EV_ADD, VQ_MOUNT|VQ_UNMOUNT|VQ_UPDATE, 0, jmr) != -1);
 	}
 
-	if (name) {
+	if (name && !no_init) {
 		bootstrapper = jobmgr_init_session(jmr, name, sflag);
 	}
 
@@ -5994,7 +5994,7 @@
 	}
 
 	if (jm->req_port == port) {
-		jobmgr_log(jm, LOG_INFO, "Request port died: 0x%x", port);
+		jobmgr_log(jm, LOG_DEBUG, "Request port died: %i", MACH_PORT_INDEX(port));
 		return jobmgr_shutdown(jm);
 	}
 
@@ -8117,7 +8117,7 @@
 
 	launchd_assert(launch_data_array_get_count(out_obj_array) == l2l_port_cnt);
 
-	if (!job_assumes(j, (jmr = jobmgr_new(j->mgr, reqport, rcvright, false, session_type, audit_session)) != NULL)) {
+	if (!job_assumes(j, (jmr = jobmgr_new(j->mgr, reqport, rcvright, false, session_type, false, audit_session)) != NULL)) {
 		kr = BOOTSTRAP_NO_MEMORY;
 		goto out;
 	}
@@ -8166,6 +8166,7 @@
 		}
 
 		if (likely(ms = machservice_new(j_for_service, serv_name, &l2l_ports[l2l_i], serv_perpid))) {
+			job_log(j, LOG_DEBUG, "Importing %s into new bootstrap.", serv_name);
 			machservice_request_notifications(ms);
 		}
 	}
@@ -8228,7 +8229,7 @@
 		}
 	}
 	
-	jobmgr_log(j->mgr, LOG_DEBUG, "Initializing: %s", session_type);
+	jobmgr_log(j->mgr, LOG_DEBUG, "Initializing as %s", session_type);
 	strcpy(j->mgr->name_init, session_type);
 	
 	if (job_assumes(j, (j2 = jobmgr_init_session(j->mgr, session_type, false)))) {
@@ -8263,7 +8264,7 @@
 	}
 	
 	if( !target_jm ) {
-		target_jm = jobmgr_new(j->mgr, requestor_port, MACH_PORT_NULL, false, session_name, audit_session);
+		target_jm = jobmgr_new(j->mgr, requestor_port, MACH_PORT_NULL, false, session_name, false, audit_session);
 		if( !target_jm ) {
 			mach_port_deallocate(mach_task_self(), audit_session);
 		} else {
@@ -8485,7 +8486,7 @@
 	char name[NAME_MAX];
 	snprintf(name, sizeof(name), "%s[%i].subset.%i", j->anonymous ? j->prog : j->label, j->p, MACH_PORT_INDEX(requestorport));
 
-	if (!job_assumes(j, (jmr = jobmgr_new(j->mgr, requestorport, MACH_PORT_NULL, false, name, j->audit_session)) != NULL)) {
+	if (!job_assumes(j, (jmr = jobmgr_new(j->mgr, requestorport, MACH_PORT_NULL, false, name, true, j->audit_session)) != NULL)) {
 		if (unlikely(requestorport == MACH_PORT_NULL)) {
 			return BOOTSTRAP_NOT_PRIVILEGED;
 		}
@@ -8729,7 +8730,7 @@
 	SLIST_INIT(&s_curious_jobs);
 	LIST_INIT(&s_needing_sessions);
 	
-	launchd_assert((root_jobmgr = jobmgr_new(NULL, MACH_PORT_NULL, MACH_PORT_NULL, sflag, root_session_type, MACH_PORT_NULL)) != NULL);
+	launchd_assert((root_jobmgr = jobmgr_new(NULL, MACH_PORT_NULL, MACH_PORT_NULL, sflag, root_session_type, false, MACH_PORT_NULL)) != NULL);
 	
 	uint32_t fflags = NOTE_ATTRIB | NOTE_LINK | NOTE_REVOKE | NOTE_EXTEND | NOTE_WRITE;
 	s_no_hang_fd = open("/dev/autofs_nowait", O_EVTONLY | O_NONBLOCK);
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/launchd-changes/attachments/20090423/ceded292/attachment.html>


More information about the launchd-changes mailing list