Revision: 22994 http://trac.macosforge.org/projects/launchd/changeset/22994 Author: zarzycki@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);
participants (1)
-
source_changes@macosforge.org