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

source_changes at macosforge.org source_changes at macosforge.org
Thu Dec 21 11:23:39 PST 2006


Revision: 22994
          http://trac.macosforge.org/projects/launchd/changeset/22994
Author:   zarzycki at apple.com
Date:     2006-12-21 11:23:38 -0800 (Thu, 21 Dec 2006)

Log Message:
-----------
<rdar://problem/4890178> ER: Specific binary slice selection for spawn_via_launchd

Modified Paths:
--------------
    trunk/launchd/src/launchd_core_logic.c
    trunk/launchd/src/launchd_mig_types.defs
    trunk/launchd/src/liblaunch_private.h
    trunk/launchd/src/liblaunch_public.h
    trunk/launchd/src/libvproc.c
    trunk/launchd/src/libvproc_internal.h
    trunk/launchd/src/protocol_job.defs

Modified: trunk/launchd/src/launchd_core_logic.c
===================================================================
--- trunk/launchd/src/launchd_core_logic.c	2006-12-20 00:48:11 UTC (rev 22993)
+++ trunk/launchd/src/launchd_core_logic.c	2006-12-21 19:23:38 UTC (rev 22994)
@@ -238,6 +238,8 @@
 	SLIST_HEAD(, machservice) machservices;
 	SLIST_HEAD(, semaphoreitem) semaphores;
 	struct rusage ru;
+	binpref_t j_binpref;
+	size_t j_binpref_cnt;
 	mach_port_t j_port;
 	mach_port_t wait_reply_port;
 	uid_t mach_uid;
@@ -266,8 +268,8 @@
 		     importing_global_env:1, importing_hard_limits:1, setmask:1, legacy_mach_job:1, runatload:1,
 		     anonymous:1;
 	mode_t mask;
-	unsigned int globargv:1, wait4debugger:1, unload_at_exit:1, force_ppc:1, stall_before_exec:1,
-		     only_once:1, currently_ignored:1, forced_peers_to_demand_mode:1;
+	unsigned int globargv:1, wait4debugger:1, unload_at_exit:1, stall_before_exec:1, only_once:1,
+		     currently_ignored:1, forced_peers_to_demand_mode:1;
 	char label[0];
 };
 
@@ -297,7 +299,7 @@
 static void job_reparent_to_aqua_hack(job_t j);
 static void job_callback(void *obj, struct kevent *kev);
 static launch_data_t job_export2(job_t j, bool subjobs);
-static job_t job_new_spawn(job_t j, const char *label, const char *path, const char *workingdir, const char *const *argv, const char *const *env, mode_t *u_mask, bool w4d, bool fppc);
+static job_t job_new_spawn(job_t j, const char *label, const char *path, const char *workingdir, const char *const *argv, const char *const *env, mode_t *u_mask, bool w4d);
 static job_t job_new_via_mach_init(job_t j, const char *cmd, uid_t uid, bool ond);
 static const char *job_prog(job_t j);
 static pid_t job_get_pid(job_t j);
@@ -816,7 +818,7 @@
 }
 
 job_t 
-job_new_spawn(job_t j, const char *label, const char *path, const char *workingdir, const char *const *argv, const char *const *env, mode_t *u_mask, bool w4d, bool fppc)
+job_new_spawn(job_t j, const char *label, const char *path, const char *workingdir, const char *const *argv, const char *const *env, mode_t *u_mask, bool w4d)
 {
 	job_t jr;
 	size_t i;
@@ -843,7 +845,6 @@
 
 	jr->unload_at_exit = true;
 	jr->stall_before_exec = w4d;
-	jr->force_ppc = fppc;
 
 	if (workingdir) {
 		jr->workingdir = strdup(workingdir);
@@ -870,8 +871,6 @@
 		envitem_new(jr, tmpstr, eqoff + 1, false);
 	}
 
-	job_dispatch(jr, true);
-
 	return jr;
 }
 
@@ -1018,12 +1017,6 @@
 job_import_bool(job_t j, const char *key, bool value)
 {
 	switch (key[0]) {
-	case 'f':
-	case 'F':
-		if (strcasecmp(key, LAUNCH_JOBKEY_FORCEPOWERPC) == 0) {
-			j->force_ppc = value;
-		}
-		break;
 	case 'k':
 	case 'K':
 		if (strcasecmp(key, LAUNCH_JOBKEY_KEEPALIVE) == 0) {
@@ -1838,9 +1831,10 @@
 	pid_t junk_pid;
 	glob_t g;
 	short spflags = POSIX_SPAWN_SETEXEC;
+	size_t binpref_out_cnt = 0;
 	int i;
 
-	posix_spawnattr_init(&spattr);
+	job_assumes(j, posix_spawnattr_init(&spattr) == 0);
 
 	job_setup_attributes(j);
 
@@ -1878,17 +1872,13 @@
 		spflags |= POSIX_SPAWN_START_SUSPENDED;
 	}
 
-	if (j->force_ppc) {
-		int affinmib[] = { CTL_KERN, KERN_AFFINITY, 1, 1 };
-		size_t mibsz = sizeof(affinmib) / sizeof(affinmib[0]);
+	job_assumes(j, posix_spawnattr_setflags(&spattr, spflags) == 0);
 
-		if (sysctl(affinmib, mibsz, NULL, NULL,  NULL, 0) == -1) {
-			job_log_error(j, LOG_WARNING, "Failed to force PowerPC execution");
-		}
+	if (j->j_binpref_cnt) {
+		job_assumes(j, posix_spawnattr_setbinpref_np(&spattr, j->j_binpref_cnt, j->j_binpref, &binpref_out_cnt) == 0);
+		job_assumes(j, binpref_out_cnt == j->j_binpref_cnt);
 	}
 
-	posix_spawnattr_setflags(&spattr, spflags);
-
 	if (j->prog) {
 		posix_spawn(&junk_pid, j->inetcompat ? file2exec : j->prog, NULL, &spattr, (char *const*)argv, environ);
 		job_log_error(j, LOG_ERR, "posix_spawn(\"%s\", ...)", j->prog);
@@ -4352,7 +4342,7 @@
 kern_return_t
 job_mig_spawn(job_t j, _internal_string_t charbuf, mach_msg_type_number_t charbuf_cnt,
 		uint32_t argc, uint32_t envc, uint64_t flags, uint16_t mig_umask,
-		pid_t *child_pid, mach_port_t *obsvr_port)
+		binpref_t bin_pref, uint32_t binpref_cnt, pid_t *child_pid, mach_port_t *obsvr_port)
 {
 	job_t jr;
 	size_t offset = 0;
@@ -4406,7 +4396,7 @@
 	}
 
 	jr = job_new_spawn(j, label, path, workingdir, argv, env, flags & SPAWN_HAS_UMASK ? &mig_umask : NULL,
-			flags & SPAWN_WANTS_WAIT4DEBUGGER, flags & SPAWN_WANTS_FORCE_PPC);
+			flags & SPAWN_WANTS_WAIT4DEBUGGER);
 
 	if (jr == NULL) switch (errno) {
 	case EEXIST:
@@ -4415,14 +4405,17 @@
 		return BOOTSTRAP_NO_MEMORY;
 	}
 
+	memcpy(jr->j_binpref, bin_pref, sizeof(jr->j_binpref));
+	jr->j_binpref_cnt = binpref_cnt;
+
+	job_dispatch(jr, true);
+
 	if (!job_setup_machport(jr)) {
 		job_remove(jr);
 		return BOOTSTRAP_NO_MEMORY;
 	}
 
-	job_log(j, LOG_INFO, "Spawned with flags:%s%s",
-			flags & SPAWN_WANTS_FORCE_PPC ? " ppc": "",
-			flags & SPAWN_WANTS_WAIT4DEBUGGER ? " stopped": "");
+	job_log(j, LOG_INFO, "Spawned with flags:%s", flags & SPAWN_WANTS_WAIT4DEBUGGER ? " stopped": "");
 
 	*child_pid = job_get_pid(jr);
 	*obsvr_port = jr->j_port;

Modified: trunk/launchd/src/launchd_mig_types.defs
===================================================================
--- trunk/launchd/src/launchd_mig_types.defs	2006-12-20 00:48:11 UTC (rev 22993)
+++ trunk/launchd/src/launchd_mig_types.defs	2006-12-21 19:23:38 UTC (rev 22994)
@@ -35,6 +35,7 @@
 type _internal_string_t		= ^array [] of char;
 type bootstrap_status_t		= integer_t;
 type bootstrap_status_array_t	= ^array [] of bootstrap_status_t;
+type binpref_t			= array [8] of integer_t;
 
 type job_t = mach_port_t
         intran: job_t job_mig_intran(mach_port_t) 

Modified: trunk/launchd/src/liblaunch_private.h
===================================================================
--- trunk/launchd/src/liblaunch_private.h	2006-12-20 00:48:11 UTC (rev 22993)
+++ trunk/launchd/src/liblaunch_private.h	2006-12-21 19:23:38 UTC (rev 22994)
@@ -20,6 +20,7 @@
 #ifndef _LAUNCH_PRIV_H_
 #define _LAUNCH_PRIV_H_
 
+#include <mach/mach.h>
 #include <sys/types.h>
 #include <launch.h>
 
@@ -93,7 +94,6 @@
  */
 
 #define SPAWN_VIA_LAUNCHD_STOPPED	0x0001
-#define SPAWN_VIA_LAUNCHD_FORCE_PPC	0x0002
 
 struct spawn_via_launchd_attr {
 	uint64_t		spawn_flags;
@@ -102,9 +102,11 @@
  	const char *const *	spawn_env;
  	const mode_t *		spawn_umask;
  	mach_port_t *		spawn_observer_port;
+ 	const cpu_type_t *	spawn_binpref;
+	size_t			spawn_binpref_cnt;
 };
 
-#define spawn_via_launchd(a, b, c) _spawn_via_launchd(a, b, c, 0)
+#define spawn_via_launchd(a, b, c) _spawn_via_launchd(a, b, c, 1)
 pid_t _spawn_via_launchd(
 		const char *label,
 		const char *const *argv,

Modified: trunk/launchd/src/liblaunch_public.h
===================================================================
--- trunk/launchd/src/liblaunch_public.h	2006-12-20 00:48:11 UTC (rev 22993)
+++ trunk/launchd/src/liblaunch_public.h	2006-12-21 19:23:38 UTC (rev 22994)
@@ -75,7 +75,6 @@
 #define LAUNCH_JOBKEY_WORKINGDIRECTORY		"WorkingDirectory"
 #define LAUNCH_JOBKEY_ENVIRONMENTVARIABLES	"EnvironmentVariables"
 #define LAUNCH_JOBKEY_USERENVIRONMENTVARIABLES	"UserEnvironmentVariables"
-#define LAUNCH_JOBKEY_FORCEPOWERPC		"ForcePowerPC"
 #define LAUNCH_JOBKEY_UMASK			"Umask"
 #define LAUNCH_JOBKEY_NICE			"Nice"
 #define LAUNCH_JOBKEY_LOWPRIORITYIO		"LowPriorityIO"

Modified: trunk/launchd/src/libvproc.c
===================================================================
--- trunk/launchd/src/libvproc.c	2006-12-20 00:48:11 UTC (rev 22993)
+++ trunk/launchd/src/libvproc.c	2006-12-21 19:23:38 UTC (rev 22994)
@@ -68,10 +68,14 @@
 	uint64_t flags = 0;
 	uint32_t argc = 0;
 	uint32_t envc = 0;
+	binpref_t bin_pref;
+	size_t binpref_cnt = 0, binpref_max = sizeof(bin_pref) / sizeof(bin_pref[0]);
 	pid_t p = -1;
 	mode_t u_mask = CMASK;
 	mach_port_t obsvr_port = MACH_PORT_NULL;
 
+	memset(&bin_pref, 0, sizeof(bin_pref));
+
 	for (tmpp = argv; *tmpp; tmpp++) {
 		argc++;
 		len = strlen(*tmpp) + 1;
@@ -81,13 +85,21 @@
 	}
 
 	if (spawn_attrs) switch (struct_version) {
+	case 1:
+		if (spawn_attrs->spawn_binpref) {
+			if (spawn_attrs->spawn_binpref_cnt < binpref_max) {
+				binpref_max = spawn_attrs->spawn_binpref_cnt;
+			}
+
+			for (; binpref_cnt < binpref_max; binpref_cnt++) {
+				bin_pref[binpref_cnt] = spawn_attrs->spawn_binpref[binpref_cnt];
+			}
+		}
+
 	case 0:
 		if (spawn_attrs->spawn_flags & SPAWN_VIA_LAUNCHD_STOPPED) {
 			flags |= SPAWN_WANTS_WAIT4DEBUGGER;
 		}
-		if (spawn_attrs->spawn_flags & SPAWN_VIA_LAUNCHD_FORCE_PPC) {
-			flags |= SPAWN_WANTS_FORCE_PPC;
-		}
 
 		if (spawn_attrs->spawn_env) {
 			for (tmpp = spawn_attrs->spawn_env; *tmpp; tmpp++) {
@@ -125,13 +137,13 @@
 		break;
 	}
 
-	kr = vproc_mig_spawn(bootstrap_port, buf, buf_len, argc, envc, flags, u_mask, &p, &obsvr_port);
+	kr = vproc_mig_spawn(bootstrap_port, buf, buf_len, argc, envc, flags, u_mask, bin_pref, binpref_cnt, &p, &obsvr_port);
 
 	if (kr == VPROC_ERR_TRY_PER_USER) {
 		mach_port_t puc;
 
 		if (vproc_mig_lookup_per_user_context(bootstrap_port, 0, &puc) == 0) {
-			kr = vproc_mig_spawn(puc, buf, buf_len, argc, envc, flags, u_mask, &p, &obsvr_port);
+			kr = vproc_mig_spawn(puc, buf, buf_len, argc, envc, flags, u_mask, bin_pref, binpref_cnt, &p, &obsvr_port);
 			mach_port_deallocate(mach_task_self(), puc);
 		}
 	}

Modified: trunk/launchd/src/libvproc_internal.h
===================================================================
--- trunk/launchd/src/libvproc_internal.h	2006-12-20 00:48:11 UTC (rev 22993)
+++ trunk/launchd/src/libvproc_internal.h	2006-12-21 19:23:38 UTC (rev 22994)
@@ -27,6 +27,7 @@
 typedef char * _internal_string_t;
 typedef char * logmsg_t;
 typedef mach_port_t vproc_mig_t;
+typedef integer_t binpref_t[8];
 typedef enum {
 	LAST_EXIT_STATUS = 1,
 	GLOBAL_ON_DEMAND,
@@ -45,7 +46,6 @@
 #define SPAWN_HAS_WDIR			0x0002
 #define SPAWN_HAS_UMASK			0x0004
 #define SPAWN_WANTS_WAIT4DEBUGGER	0x0008
-#define SPAWN_WANTS_FORCE_PPC		0x0010
 
 kern_return_t
 _vproc_grab_subset(mach_port_t bp, mach_port_t *reqport, mach_port_t *rcvright,

Modified: trunk/launchd/src/protocol_job.defs
===================================================================
--- trunk/launchd/src/protocol_job.defs	2006-12-20 00:48:11 UTC (rev 22993)
+++ trunk/launchd/src/protocol_job.defs	2006-12-21 19:23:38 UTC (rev 22994)
@@ -99,6 +99,8 @@
 		__envc		: uint32_t;
 		__flags		: uint64_t;
 		__umask		: uint16_t;
+		__binpref	: binpref_t;
+		__binpref_cnt	: uint32_t;
 	out	__pid		: pid_t;
 	out	__obsvr_port	: mach_port_make_send_t);
 

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


More information about the launchd-changes mailing list