[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