[launchd-changes] [23906] trunk/launchd/src
source_changes at macosforge.org
source_changes at macosforge.org
Thu Apr 23 13:28:25 PDT 2009
Revision: 23906
http://trac.macosforge.org/projects/launchd/changeset/23906
Author: dsorresso at apple.com
Date: 2009-04-23 13:28:24 -0700 (Thu, 23 Apr 2009)
Log Message:
-----------
<rdar://problem/6803005> LEAK: 10A333: Finder leaking memory and hangs after running FinderOpsPlus tool
Fixes for bstree subcommand.
Modified Paths:
--------------
trunk/launchd/src/bootstrap_priv.h
trunk/launchd/src/launchctl.c
trunk/launchd/src/launchd_core_logic.c
trunk/launchd/src/launchd_runtime.c
trunk/launchd/src/libbootstrap.c
trunk/launchd/src/protocol_vproc.defs
trunk/launchd/src/vproc_internal.h
Modified: trunk/launchd/src/bootstrap_priv.h
===================================================================
--- trunk/launchd/src/bootstrap_priv.h 2009-04-22 20:18:51 UTC (rev 23905)
+++ trunk/launchd/src/bootstrap_priv.h 2009-04-23 20:28:24 UTC (rev 23906)
@@ -27,13 +27,16 @@
#pragma GCC visibility push(default)
-#define BOOTSTRAP_PER_PID_SERVICE 1 << 0
-#define BOOTSTRAP_ALLOW_LOOKUP 1 << 1
-#define BOOTSTRAP_DENY_JOB_CREATION 1 << 2
-#define BOOTSTRAP_PRIVILEGED_SERVER 1 << 3
+#define BOOTSTRAP_PER_PID_SERVICE 1 << 0
+#define BOOTSTRAP_ALLOW_LOOKUP 1 << 1
+#define BOOTSTRAP_DENY_JOB_CREATION 1 << 2
+#define BOOTSTRAP_PRIVILEGED_SERVER 1 << 3
+#define BOOTSTRAP_FORCE_LOCAL 1 << 4
-#define BOOTSTRAP_PROPERTY_SUBSET 1 << 0
-#define BOOTSTRAP_PROPERTY_PERUSER 1 << 1
+#define BOOTSTRAP_PROPERTY_EXPLICITSUBSET 1 << 0 /* Created via bootstrap_subset(). */
+#define BOOTSTRAP_PROPERTY_IMPLICITSUBSET 1 << 1 /* Created via _vprocmgr_switch_to_session(). */
+#define BOOTSTRAP_PROPERTY_MOVEDSUBSET 1 << 2 /* Created via _vprocmgr_move_subset_to_user(). */
+#define BOOTSTRAP_PROPERTY_PERUSER 1 << 3 /* A per-user launchd's root bootstrap. */
kern_return_t bootstrap_register2(mach_port_t bp, name_t service_name, mach_port_t sp, uint64_t flags);
Modified: trunk/launchd/src/launchctl.c
===================================================================
--- trunk/launchd/src/launchctl.c 2009-04-22 20:18:51 UTC (rev 23905)
+++ trunk/launchd/src/launchctl.c 2009-04-23 20:28:24 UTC (rev 23906)
@@ -209,7 +209,7 @@
static int umask_cmd(int argc, char *const argv[]);
static int getrusage_cmd(int argc, char *const argv[]);
static int bsexec_cmd(int argc, char *const argv[]);
-static int _bslist_cmd(mach_port_t bport, unsigned int depth, bool show_job);
+static int _bslist_cmd(mach_port_t bport, unsigned int depth, bool show_job, bool local_only);
static int bslist_cmd(int argc, char *const argv[]);
static int _bstree_cmd(mach_port_t bsport, unsigned int depth, bool show_jobs);
static int bstree_cmd(int argc __attribute__((unused)), char * const argv[] __attribute__((unused)));
@@ -3325,7 +3325,7 @@
}
int
-_bslist_cmd(mach_port_t bport, unsigned int depth, bool show_job)
+_bslist_cmd(mach_port_t bport, unsigned int depth, bool show_job, bool local_only)
{
kern_return_t result;
name_array_t service_names;
@@ -3339,7 +3339,9 @@
return 1;
}
- result = bootstrap_info(bport, &service_names, &service_cnt, &service_jobs, &service_jobs_cnt, &service_actives, &service_active_cnt);
+ uint64_t flags = 0;
+ flags |= local_only ? BOOTSTRAP_FORCE_LOCAL : 0;
+ result = bootstrap_info(bport, &service_names, &service_cnt, &service_jobs, &service_jobs_cnt, &service_actives, &service_active_cnt, flags);
if (result != BOOTSTRAP_SUCCESS) {
fprintf(stderr, "bootstrap_info(): %d\n", result);
return 1;
@@ -3380,7 +3382,7 @@
return 1;
}
- return _bslist_cmd(bport, 0, show_jobs);
+ return _bslist_cmd(bport, 0, show_jobs, false);
}
int
@@ -3408,10 +3410,20 @@
}
unsigned int i = 0;
- _bslist_cmd(bsport, depth, show_jobs);
+ _bslist_cmd(bsport, depth, show_jobs, true);
for( i = 0; i < cnt; i++ ) {
- char *type = ( child_props[i] & BOOTSTRAP_PROPERTY_PERUSER ) ? "Per-user" : "Subset";
+ char *type = NULL;
+ if( child_props[i] & BOOTSTRAP_PROPERTY_PERUSER ) {
+ type = "Per-user";
+ } else if( child_props[i] & BOOTSTRAP_PROPERTY_EXPLICITSUBSET ) {
+ type = "Explicit Subset";
+ } else if( child_props[i] & BOOTSTRAP_PROPERTY_IMPLICITSUBSET ) {
+ type = "Implicit Subset";
+ } else if( child_props[i] & BOOTSTRAP_PROPERTY_MOVEDSUBSET ) {
+ type = "Moved Subset";
+ }
+
fprintf(stdout, "%*s%s (%s)/\n", depth, "", child_names[i], type);
if( child_ports[i] != MACH_PORT_NULL ) {
_bstree_cmd(child_ports[i], depth + 4, show_jobs);
Modified: trunk/launchd/src/launchd_core_logic.c
===================================================================
--- trunk/launchd/src/launchd_core_logic.c 2009-04-22 20:18:51 UTC (rev 23905)
+++ trunk/launchd/src/launchd_core_logic.c 2009-04-23 20:28:24 UTC (rev 23906)
@@ -360,9 +360,9 @@
killed_hopefully_first_jobs :1,
killed_normal_jobs :1,
killed_hopefully_last_jobs :1,
- killed_stray_jobs :1,
- created_via_subset :1;
+ killed_stray_jobs :1;
char sample_log_file[PATH_MAX];
+ uint32_t properties;
union {
const char name[0];
char name_init[0];
@@ -5344,13 +5344,13 @@
jobmgr_t jm_to_insert = j->mgr;
if( g_flat_mach_namespace ) {
- jm_to_insert = j->mgr->created_via_subset ? j->mgr : root_jobmgr;
+ jm_to_insert = (j->mgr->properties & BOOTSTRAP_PROPERTY_EXPLICITSUBSET) ? j->mgr : root_jobmgr;
}
LIST_INSERT_HEAD(&jm_to_insert->ms_hash[hash_ms(ms->name)], ms, name_hash_sle);
LIST_INSERT_HEAD(&port_hash[HASH_PORT(ms->port)], ms, port_hash_sle);
- job_log(j, LOG_DEBUG, "Mach service added%s: %s", j->mgr->created_via_subset ? " to private namespace" : "", name);
+ job_log(j, LOG_DEBUG, "Mach service added%s: %s", (j->mgr->properties & BOOTSTRAP_PROPERTY_EXPLICITSUBSET) ? " to private namespace" : "", name);
return ms;
out_bad2:
@@ -5900,6 +5900,10 @@
if (bootstrapper) {
bootstrapper->audit_session = session_port;
+ if( session_port != MACH_PORT_NULL ) {
+ mach_port_mod_refs(mach_task_self(), session_port, MACH_PORT_RIGHT_SEND, 1);
+ }
+
jobmgr_log(jmr, LOG_DEBUG, "Bootstrapping new job manager with audit session %u", session_port);
jobmgr_assumes(jmr, job_dispatch(bootstrapper, true) != NULL);
}
@@ -6029,7 +6033,7 @@
return NULL;
}
- jobmgr_t jm_to_search = ( g_flat_mach_namespace && !jm->created_via_subset ) ? root_jobmgr : jm;
+ jobmgr_t jm_to_search = ( g_flat_mach_namespace && !(jm->properties & BOOTSTRAP_PROPERTY_EXPLICITSUBSET) ) ? root_jobmgr : jm;
LIST_FOREACH(ms, &jm_to_search->ms_hash[hash_ms(name)], name_hash_sle) {
if (!ms->per_pid && strcmp(name, ms->name) == 0) {
return ms;
@@ -7706,7 +7710,8 @@
kern_return_t
job_mig_info(job_t j, name_array_t *servicenamesp, unsigned int *servicenames_cnt,
name_array_t *servicejobsp, unsigned int *servicejobs_cnt,
- bootstrap_status_array_t *serviceactivesp, unsigned int *serviceactives_cnt)
+ bootstrap_status_array_t *serviceactivesp, unsigned int *serviceactives_cnt,
+ uint64_t flags)
{
name_array_t service_names = NULL;
name_array_t service_jobs = NULL;
@@ -7718,7 +7723,15 @@
return BOOTSTRAP_NO_MEMORY;
}
- jm = (g_flat_mach_namespace && !j->mgr->created_via_subset) ? root_jobmgr : j->mgr;
+ if( g_flat_mach_namespace ) {
+ if( (j->mgr->properties & BOOTSTRAP_PROPERTY_EXPLICITSUBSET) || (flags & BOOTSTRAP_FORCE_LOCAL) ) {
+ jm = j->mgr;
+ } else {
+ jm = root_jobmgr;
+ }
+ } else {
+ jm = j->mgr;
+ }
unsigned int i = 0;
struct machservice *msi = NULL;
@@ -7808,7 +7821,7 @@
jobmgr_t jmr = j->mgr;
jobmgr_t jmi = NULL;
SLIST_FOREACH( jmi, &jmr->submgrs, sle ) {
- cnt += g_flat_mach_namespace ? ( jmi->created_via_subset ? 1 : 0 ) : 1;
+ cnt++;
}
/* Find our per-user launchds if we're PID 1. */
@@ -7846,40 +7859,36 @@
unsigned int cnt2 = 0;
SLIST_FOREACH( jmi, &jmr->submgrs, sle ) {
- if( (g_flat_mach_namespace && jmi->created_via_subset) || !g_flat_mach_namespace ) {
- if( jobmgr_assumes(jmi, launchd_mport_make_send(jmi->jm_port)) == KERN_SUCCESS ) {
- _child_ports[cnt2] = jmi->jm_port;
- } else {
- _child_ports[cnt2] = MACH_PORT_NULL;
- }
-
- strlcpy(_child_names[cnt2], jmi->name, sizeof(_child_names[0]));
- _child_properties[cnt2] |= BOOTSTRAP_PROPERTY_SUBSET;
-
- cnt2++;
+ if( jobmgr_assumes(jmi, launchd_mport_make_send(jmi->jm_port) == KERN_SUCCESS) ) {
+ _child_ports[cnt2] = jmi->jm_port;
+ } else {
+ _child_ports[cnt2] = MACH_PORT_NULL;
}
+
+ strlcpy(_child_names[cnt2], jmi->name, sizeof(_child_names[0]));
+ _child_properties[cnt2] = jmi->properties;
+
+ cnt2++;
}
- if( pid1_magic ) {
- LIST_FOREACH( ji, &jmr->jobs, sle ) {
- if( ji->per_user ) {
- if( job_assumes(ji, SLIST_FIRST(&ji->machservices)->per_user_hack == true) ) {
- mach_port_t port = machservice_port(SLIST_FIRST(&ji->machservices));
-
- if( job_assumes(ji, launchd_mport_copy_send(port)) == KERN_SUCCESS ) {
- _child_ports[cnt2] = port;
- } else {
- _child_ports[cnt2] = MACH_PORT_NULL;
- }
+ if( pid1_magic ) LIST_FOREACH( ji, &jmr->jobs, sle ) {
+ if( ji->per_user ) {
+ if( job_assumes(ji, SLIST_FIRST(&ji->machservices)->per_user_hack == true) ) {
+ mach_port_t port = machservice_port(SLIST_FIRST(&ji->machservices));
+
+ if( job_assumes(ji, launchd_mport_copy_send(port) == KERN_SUCCESS) ) {
+ _child_ports[cnt2] = port;
} else {
_child_ports[cnt2] = MACH_PORT_NULL;
}
-
- strlcpy(_child_names[cnt2], ji->label, sizeof(_child_names[0]));
- _child_properties[cnt2] |= BOOTSTRAP_PROPERTY_PERUSER;
-
- cnt2++;
+ } else {
+ _child_ports[cnt2] = MACH_PORT_NULL;
}
+
+ strlcpy(_child_names[cnt2], ji->label, sizeof(_child_names[0]));
+ _child_properties[cnt2] |= BOOTSTRAP_PROPERTY_PERUSER;
+
+ cnt2++;
}
}
@@ -8113,6 +8122,8 @@
goto out;
}
+ jmr->properties |= BOOTSTRAP_PROPERTY_MOVEDSUBSET;
+
/* This is a hack. We should be doing this in jobmgr_new(), but since we're in the middle of
* processing an IPC request, we'll do this action before the new job manager can get any IPC
* requests. This serialization is guaranteed since we are single-threaded in that respect.
@@ -8255,6 +8266,8 @@
target_jm = jobmgr_new(j->mgr, requestor_port, MACH_PORT_NULL, false, session_name, audit_session);
if( !target_jm ) {
mach_port_deallocate(mach_task_self(), audit_session);
+ } else {
+ target_jm->properties |= BOOTSTRAP_PROPERTY_IMPLICITSUBSET;
}
}
@@ -8480,7 +8493,7 @@
}
*subsetportp = jmr->jm_port;
- jmr->created_via_subset = true;
+ jmr->properties |= BOOTSTRAP_PROPERTY_EXPLICITSUBSET;
job_log(j, LOG_DEBUG, "Job created a subset named \"%s\"", jmr->name);
return BOOTSTRAP_SUCCESS;
Modified: trunk/launchd/src/launchd_runtime.c
===================================================================
--- trunk/launchd/src/launchd_runtime.c 2009-04-22 20:18:51 UTC (rev 23905)
+++ trunk/launchd/src/launchd_runtime.c 2009-04-23 20:28:24 UTC (rev 23906)
@@ -1124,7 +1124,9 @@
}
continue;
default:
- launchd_assumes(mr == MACH_MSG_SUCCESS);
+ if( !launchd_assumes(mr == MACH_MSG_SUCCESS) ) {
+ runtime_syslog(LOG_ERR, "mach_msg(): %u: %s", mr, mach_error_string(mr));
+ }
continue;
}
Modified: trunk/launchd/src/libbootstrap.c
===================================================================
--- trunk/launchd/src/libbootstrap.c 2009-04-22 20:18:51 UTC (rev 23905)
+++ trunk/launchd/src/libbootstrap.c 2009-04-23 20:28:24 UTC (rev 23906)
@@ -269,9 +269,10 @@
bootstrap_info(mach_port_t bp,
name_array_t *service_names, mach_msg_type_number_t *service_namesCnt,
name_array_t *service_jobs, mach_msg_type_number_t *service_jobsCnt,
- bootstrap_status_array_t *service_active, mach_msg_type_number_t *service_activeCnt)
+ bootstrap_status_array_t *service_active, mach_msg_type_number_t *service_activeCnt,
+ uint64_t flags)
{
- return vproc_mig_info(bp, service_names, service_namesCnt, service_jobs, service_jobsCnt, service_active, service_activeCnt);
+ return vproc_mig_info(bp, service_names, service_namesCnt, service_jobs, service_jobsCnt, service_active, service_activeCnt, flags);
}
const char *
Modified: trunk/launchd/src/protocol_vproc.defs
===================================================================
--- trunk/launchd/src/protocol_vproc.defs 2009-04-22 20:18:51 UTC (rev 23905)
+++ trunk/launchd/src/protocol_vproc.defs 2009-04-23 20:28:24 UTC (rev 23906)
@@ -90,7 +90,8 @@
__bs_port : job_t;
out __service_names : name_array_t, dealloc;
out __service_jobs : name_array_t, dealloc;
-out __service_active : bootstrap_status_array_t, dealloc);
+out __service_active : bootstrap_status_array_t, dealloc;
+ __flags : uint64_t);
routine subset(
__bs_port : job_t;
Modified: trunk/launchd/src/vproc_internal.h
===================================================================
--- trunk/launchd/src/vproc_internal.h 2009-04-22 20:18:51 UTC (rev 23905)
+++ trunk/launchd/src/vproc_internal.h 2009-04-23 20:28:24 UTC (rev 23906)
@@ -118,7 +118,8 @@
name_array_t *service_jobs,
mach_msg_type_number_t *service_jobsCnt,
bootstrap_status_array_t *service_active,
- mach_msg_type_number_t *service_activeCnt);
+ mach_msg_type_number_t *service_activeCnt,
+ uint64_t flags);
#pragma GCC visibility pop
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/launchd-changes/attachments/20090423/859cae58/attachment-0001.html>
More information about the launchd-changes
mailing list