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

source_changes at macosforge.org source_changes at macosforge.org
Sat Sep 23 23:20:36 PDT 2006


Revision: 22877
          http://trac.macosforge.org/projects/launchd/changeset/22877
Author:   zarzycki at apple.com
Date:     2006-09-23 23:20:35 -0700 (Sat, 23 Sep 2006)

Log Message:
-----------
Structural reorganization:

Okay. The "transfer sub-bootstrap" API is a necessary evil at the moment (sigh).

Let's make sure anonymous jobs survive the transfer.

We should be able to now undo the merger of bootstraps and jobs while at the
same time being left with something cleaner than when we started.

Modified Paths:
--------------
    trunk/launchd/src/bootstrap.defs
    trunk/launchd/src/bootstrap_private.h
    trunk/launchd/src/bootstrap_public.c
    trunk/launchd/src/launchd.c
    trunk/launchd/src/launchd.h
    trunk/launchd/src/launchd_mach_ipc.c

Modified: trunk/launchd/src/bootstrap.defs
===================================================================
--- trunk/launchd/src/bootstrap.defs	2006-09-24 00:59:30 UTC (rev 22876)
+++ trunk/launchd/src/bootstrap.defs	2006-09-24 06:20:35 UTC (rev 22877)
@@ -98,6 +98,7 @@
 	out	__bs_reqport	: mach_port_t;
 	out	__bs_rcvright	: mach_port_move_receive_t;
 	out	__service_names	: name_array_t, dealloc;
+	out	__service_pids	: pointer_t, dealloc;
 	out	__service_ports	: mach_port_array_t, dealloc);
 
 routine bootstrap_getsocket(

Modified: trunk/launchd/src/bootstrap_private.h
===================================================================
--- trunk/launchd/src/bootstrap_private.h	2006-09-24 00:59:30 UTC (rev 22876)
+++ trunk/launchd/src/bootstrap_private.h	2006-09-24 06:20:35 UTC (rev 22877)
@@ -30,6 +30,7 @@
 kern_return_t
 _launchd_to_launchd(mach_port_t bp, mach_port_t *reqport, mach_port_t *rcvright,
 		name_array_t *service_names, mach_msg_type_number_t *service_namesCnt,
+		vm_offset_t *service_pids, mach_msg_type_number_t *service_pidsCnt,
 		mach_port_array_t *ports, mach_msg_type_number_t *portCnt);
 
 kern_return_t bootstrap_getsocket(mach_port_t bp, name_t);

Modified: trunk/launchd/src/bootstrap_public.c
===================================================================
--- trunk/launchd/src/bootstrap_public.c	2006-09-24 00:59:30 UTC (rev 22876)
+++ trunk/launchd/src/bootstrap_public.c	2006-09-24 06:20:35 UTC (rev 22877)
@@ -41,9 +41,10 @@
 kern_return_t
 _launchd_to_launchd(mach_port_t bp, mach_port_t *reqport, mach_port_t *rcvright,
 		name_array_t *service_names, mach_msg_type_number_t *service_namesCnt,
+		vm_offset_t *service_pids, mach_msg_type_number_t *service_pidsCnt,
 		mach_port_array_t *ports, mach_msg_type_number_t *portCnt)
 {
-	return raw_bootstrap_transfer_subset(bp, reqport, rcvright, service_names, service_namesCnt, ports, portCnt);
+	return raw_bootstrap_transfer_subset(bp, reqport, rcvright, service_names, service_namesCnt, service_pids, service_pidsCnt, ports, portCnt);
 }
 
 pid_t

Modified: trunk/launchd/src/launchd.c
===================================================================
--- trunk/launchd/src/launchd.c	2006-09-24 00:59:30 UTC (rev 22876)
+++ trunk/launchd/src/launchd.c	2006-09-24 06:20:35 UTC (rev 22877)
@@ -117,7 +117,8 @@
 		SIGWINCH, SIGINFO, SIGUSR1, SIGUSR2
 	};
 	bool sflag = false, dflag = false, Dflag = false;
-	mach_msg_type_number_t l2l_name_cnt = 0, l2l_port_cnt = 0;
+	mach_msg_type_number_t l2l_name_cnt = 0, l2l_port_cnt = 0, l2l_pid_cnt = 0;
+	pid_t *l2l_pids = NULL;
 	name_array_t l2l_names = NULL;
 	mach_port_array_t l2l_ports = NULL;
 	char ldconf[PATH_MAX] = PID1LAUNCHD_CONF;
@@ -246,19 +247,31 @@
 		launchd_assert(bootstrap_parent(bootstrap_port, &newparent) == BOOTSTRAP_SUCCESS);
 
 		launchd_assert(_launchd_to_launchd(bootstrap_port, &req_mport, &checkin_mport,
-					&l2l_names, &l2l_name_cnt, &l2l_ports, &l2l_port_cnt) == BOOTSTRAP_SUCCESS);
+					&l2l_names, &l2l_name_cnt, (vm_offset_t *)&l2l_pids, &l2l_pid_cnt,
+					&l2l_ports, &l2l_port_cnt) == BOOTSTRAP_SUCCESS);
 
-		launchd_assert(l2l_name_cnt == l2l_port_cnt);
+		launchd_assert(l2l_name_cnt == l2l_port_cnt && l2l_name_cnt == (l2l_pid_cnt / sizeof(pid_t)));
 
 		task_set_bootstrap_port(mach_task_self(), newparent);
 		launchd_assumes(mach_port_deallocate(mach_task_self(), bootstrap_port) == KERN_SUCCESS);
 		bootstrap_port = newparent;
 	}
 
-	mach_init_init(req_mport, checkin_mport, l2l_names, l2l_ports, l2l_name_cnt);
+	mach_init_init(req_mport, checkin_mport, l2l_names, l2l_ports, l2l_pids, l2l_name_cnt);
 
-	if (h)
+	if (l2l_names) {
+		mig_deallocate((vm_address_t)l2l_names, l2l_name_cnt * sizeof(l2l_names[0]));
+	}
+	if (l2l_ports) {
+		mig_deallocate((vm_address_t)l2l_ports, l2l_port_cnt * sizeof(l2l_ports[0]));
+	}
+	if (l2l_pids) {
+		mig_deallocate((vm_address_t)l2l_pids, l2l_pid_cnt);
+	}
+
+	if (h) {
 		sprintf(ldconf, "%s/%s", h, LAUNCHD_CONF);
+	}
 
 	rlcj = job_new(root_job, READCONF_LABEL, LAUNCHCTL_PATH, NULL, ldconf, MACH_PORT_NULL);
 	launchd_assert(rlcj != NULL);

Modified: trunk/launchd/src/launchd.h
===================================================================
--- trunk/launchd/src/launchd.h	2006-09-24 00:59:30 UTC (rev 22876)
+++ trunk/launchd/src/launchd.h	2006-09-24 06:20:35 UTC (rev 22877)
@@ -59,7 +59,7 @@
 void catatonia(void);
 
 void mach_start_shutdown(void);
-void mach_init_init(mach_port_t, mach_port_t, name_array_t, mach_port_array_t, mach_msg_type_number_t);
+void mach_init_init(mach_port_t, mach_port_t, name_array_t, mach_port_array_t, pid_t *, mach_msg_type_number_t);
 
 int _fd(int fd);
 

Modified: trunk/launchd/src/launchd_mach_ipc.c
===================================================================
--- trunk/launchd/src/launchd_mach_ipc.c	2006-09-24 00:59:30 UTC (rev 22876)
+++ trunk/launchd/src/launchd_mach_ipc.c	2006-09-24 06:20:35 UTC (rev 22877)
@@ -83,11 +83,11 @@
 
 void
 mach_init_init(mach_port_t req_port, mach_port_t checkin_port,
-		name_array_t l2l_names, mach_port_array_t l2l_ports, mach_msg_type_number_t l2l_cnt)
+		name_array_t l2l_names, mach_port_array_t l2l_ports, pid_t *l2l_pids, mach_msg_type_number_t l2l_cnt)
 {
 	mach_msg_type_number_t l2l_i;
 	auditinfo_t inherited_audit;
-	job_t root_anon_job;
+	job_t anon_job;
 
 	getaudit(&inherited_audit);
 	inherited_asid = inherited_audit.ai_asid;
@@ -109,12 +109,14 @@
 		return;
 	}
 
-	launchd_assert(root_anon_job = job_new_anonymous(root_job, 0));
-
 	for (l2l_i = 0; l2l_i < l2l_cnt; l2l_i++) {
 		struct machservice *ms;
 
-		if ((ms = machservice_new(root_anon_job, l2l_names[l2l_i], l2l_ports + l2l_i))) {
+		if (!(anon_job = job_find_by_pid(root_job, l2l_pids[l2l_i], false))) {
+			launchd_assert(anon_job = job_new_anonymous(root_job, l2l_pids[l2l_i]));
+		}
+
+		if ((ms = machservice_new(anon_job, l2l_names[l2l_i], &l2l_ports[l2l_i]))) {
 			machservice_watch(ms);
 		}
 	}
@@ -374,6 +376,7 @@
 	name_array_t service_names;
 	bootstrap_status_array_t service_actives;
 	mach_port_array_t ports;
+	pid_t *pids;
 	unsigned int i;
 };
 
@@ -390,6 +393,7 @@
 		info_resp->service_actives[info_resp->i] = machservice_status(ms);
 	} else {
 		info_resp->ports[info_resp->i] = machservice_port(ms);
+		info_resp->pids[info_resp->i] = job_get_pid(machservice_job(ms));
 	}
 	info_resp->i++;
 }
@@ -398,20 +402,19 @@
 x_bootstrap_info(mach_port_t bp, name_array_t *servicenamesp, unsigned int *servicenames_cnt,
 		bootstrap_status_array_t *serviceactivesp, unsigned int *serviceactives_cnt)
 {
-	struct x_bootstrap_info_copyservices_cb info_resp = { NULL, NULL, NULL, 0 };
+	struct x_bootstrap_info_copyservices_cb info_resp = { NULL, NULL, NULL, NULL, 0 };
 	job_t ji, j = job_find_by_port(bp);
-	kern_return_t result;
 	unsigned int cnt = 0;
 
 	for (ji = j; ji; ji = job_parent(ji))
 		job_foreach_service(ji, x_bootstrap_info_countservices, &cnt, false);
 
-	result = vm_allocate(mach_task_self(), (vm_address_t *)&info_resp.service_names, cnt * sizeof(info_resp.service_names[0]), true);
-	if (!launchd_assumes(result == KERN_SUCCESS))
+	mig_allocate((vm_address_t *)&info_resp.service_names, cnt * sizeof(info_resp.service_names[0]));
+	if (!launchd_assumes(info_resp.service_names != NULL))
 		goto out_bad;
 
-	result = vm_allocate(mach_task_self(), (vm_address_t *)&info_resp.service_actives, cnt * sizeof(info_resp.service_actives[0]), true);
-	if (!launchd_assumes(result == KERN_SUCCESS))
+	mig_allocate((vm_address_t *)&info_resp.service_actives, cnt * sizeof(info_resp.service_actives[0]));
+	if (!launchd_assumes(info_resp.service_actives != NULL))
 		goto out_bad;
 
 	for (ji = j; ji; ji = job_parent(ji))
@@ -426,21 +429,25 @@
 	return BOOTSTRAP_SUCCESS;
 
 out_bad:
-	if (info_resp.service_names)
-		vm_deallocate(mach_task_self(), (vm_address_t)info_resp.service_names, cnt * sizeof(info_resp.service_names[0]));
+	if (info_resp.service_names) {
+		mig_deallocate((vm_address_t)info_resp.service_names, cnt * sizeof(info_resp.service_names[0]));
+	}
+	if (info_resp.service_actives) {
+		mig_deallocate((vm_address_t)info_resp.service_actives, cnt * sizeof(info_resp.service_actives[0]));
+	}
 
 	return BOOTSTRAP_NO_MEMORY;
 }
 
 kern_return_t
 x_bootstrap_transfer_subset(mach_port_t bp, mach_port_t *reqport, mach_port_t *rcvright,
-	name_array_t *servicenamesp, unsigned int *servicenames_cnt,
-	mach_port_array_t *ports, unsigned int *ports_cnt)
+		name_array_t *servicenamesp, unsigned int *servicenames_cnt,
+		vm_offset_t *service_pids, mach_msg_type_number_t *service_pidsCnt,
+		mach_port_array_t *ports, unsigned int *ports_cnt)
 {
-	struct x_bootstrap_info_copyservices_cb info_resp = { NULL, NULL, NULL, 0 };
+	struct x_bootstrap_info_copyservices_cb info_resp = { NULL, NULL, NULL, NULL, 0 };
 	job_t j = job_find_by_port(bp);
 	unsigned int cnt = 0;
-	kern_return_t result;
 
 	if (getpid() != 1) {
 		job_log(j, LOG_ERR, "Only the system launchd will transfer Mach sub-bootstraps.");
@@ -454,14 +461,18 @@
 
 	job_foreach_service(j, x_bootstrap_info_countservices, &cnt, true);
 
-	result = vm_allocate(mach_task_self(), (vm_address_t *)&info_resp.service_names, cnt * sizeof(info_resp.service_names[0]), true);
-	if (!launchd_assumes(result == KERN_SUCCESS))
+	mig_allocate((vm_address_t *)&info_resp.service_names, cnt * sizeof(info_resp.service_names[0]));
+	if (!launchd_assumes(info_resp.service_names != NULL))
 		goto out_bad;
 
-	result = vm_allocate(mach_task_self(), (vm_address_t *)&info_resp.ports, cnt * sizeof(info_resp.ports[0]), true);
-	if (!launchd_assumes(result == KERN_SUCCESS))
+	mig_allocate((vm_address_t *)&info_resp.ports, cnt * sizeof(info_resp.ports[0]));
+	if (!launchd_assumes(info_resp.ports != NULL))
 		goto out_bad;
 
+	mig_allocate((vm_address_t *)&info_resp.pids, cnt * sizeof(pid_t));
+	if (!launchd_assumes(info_resp.pids != NULL))
+		goto out_bad;
+
 	job_foreach_service(j, x_bootstrap_info_copyservices, &info_resp, true);
 
 	launchd_assumes(info_resp.i == cnt);
@@ -469,6 +480,8 @@
 	*servicenamesp = info_resp.service_names;
 	*ports = info_resp.ports;
 	*servicenames_cnt = *ports_cnt = cnt;
+	*service_pids = (vm_offset_t)info_resp.pids;
+	*service_pidsCnt = cnt * sizeof(pid_t);
 
 	*reqport = job_get_reqport(j);
 	*rcvright = job_get_bsport(j);
@@ -480,8 +493,15 @@
 	return BOOTSTRAP_SUCCESS;
 
 out_bad:
-	if (info_resp.service_names)
-		vm_deallocate(mach_task_self(), (vm_address_t)info_resp.service_names, cnt * sizeof(info_resp.service_names[0]));
+	if (info_resp.service_names) {
+		mig_deallocate((vm_address_t)info_resp.service_names, cnt * sizeof(info_resp.service_names[0]));
+	}
+	if (info_resp.ports) {
+		mig_deallocate((vm_address_t)info_resp.ports, cnt * sizeof(info_resp.ports[0]));
+	}
+	if (info_resp.pids) {
+		mig_deallocate((vm_address_t)info_resp.pids, cnt * sizeof(pid_t));
+	}
 
 	return BOOTSTRAP_NO_MEMORY;
 }

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


More information about the launchd-changes mailing list