[launchd-changes] [23075] trunk/launchd/src
source_changes at macosforge.org
source_changes at macosforge.org
Thu Feb 15 18:51:55 PST 2007
Revision: 23075
http://trac.macosforge.org/projects/launchd/changeset/23075
Author: zarzycki at apple.com
Date: 2007-02-15 18:51:55 -0800 (Thu, 15 Feb 2007)
Log Message:
-----------
Remove the "gc_this_jobmgr" hack and other cleanup.
Modified Paths:
--------------
trunk/launchd/src/launchd_core_logic.c
trunk/launchd/src/launchd_core_logic.h
trunk/launchd/src/launchd_runtime.c
trunk/launchd/src/protocol_job.defs
Modified: trunk/launchd/src/launchd_core_logic.c
===================================================================
--- trunk/launchd/src/launchd_core_logic.c 2007-02-15 22:21:08 UTC (rev 23074)
+++ trunk/launchd/src/launchd_core_logic.c 2007-02-16 02:51:55 UTC (rev 23075)
@@ -204,7 +204,7 @@
char *jm_stderr;
int reboot_flags;
unsigned int global_on_demand_cnt;
- unsigned int transfer_bstrap:1, sent_stop_to_hopeful_jobs:1, shutting_down:1;
+ unsigned int sent_stop_to_hopeful_jobs:1, shutting_down:1;
char name[0];
};
@@ -213,14 +213,13 @@
static jobmgr_t jobmgr_new(jobmgr_t jm, mach_port_t requestorport, mach_port_t checkin_port);
static jobmgr_t jobmgr_parent(jobmgr_t jm);
-static jobmgr_t jobmgr_tickle(jobmgr_t jm);
+static jobmgr_t jobmgr_do_garbage_collection(jobmgr_t jm);
static bool jobmgr_is_idle(jobmgr_t jm);
static void jobmgr_log_stray_children(jobmgr_t jm);
static void jobmgr_remove(jobmgr_t jm);
static void jobmgr_dispatch_all(jobmgr_t jm);
static job_t jobmgr_new_anonymous(jobmgr_t jm);
static job_t job_mig_intran2(jobmgr_t jm, mach_port_t p);
-static mach_port_t jobmgr_get_reqport(jobmgr_t jm);
static void job_export_all2(jobmgr_t jm, launch_data_t where);
static pid_t jobmgr_fork(jobmgr_t jm);
static void jobmgr_setup_env_from_other_jobs(jobmgr_t jm);
@@ -353,7 +352,6 @@
static int dir_has_files(job_t j, const char *path);
static char **mach_cmd2argv(const char *string);
jobmgr_t root_jobmgr;
-jobmgr_t gc_this_jobmgr;
void
job_ignore(job_t j)
@@ -526,6 +524,8 @@
jobmgr_log(jm, LOG_DEBUG, "Beginning job manager shutdown");
+ jm->shutting_down = true;
+
SLIST_FOREACH_SAFE(jmi, &jm->submgrs, sle, jmn) {
jobmgr_shutdown(jmi);
}
@@ -538,9 +538,7 @@
}
}
- jm->shutting_down = true;
-
- return jobmgr_tickle(jm);
+ return jobmgr_do_garbage_collection(jm);
}
void
@@ -559,7 +557,12 @@
/* We should have one job left and it should be the anonymous job */
ji = TAILQ_FIRST(&jm->jobs);
- jobmgr_assumes(jm, ji && ji == jm->anonj && (TAILQ_NEXT(ji, sle) == NULL));
+ if (!(jobmgr_assumes(jm, ji != NULL) && jobmgr_assumes(jm, ji == jm->anonj)
+ && jobmgr_assumes(jm, TAILQ_NEXT(ji, sle) == NULL))) {
+ TAILQ_FOREACH(ji, &jm->jobs, sle) {
+ job_log(ji, LOG_ERR, "Still remaining at removal.");
+ }
+ }
while ((ji = TAILQ_FIRST(&jm->jobs))) {
job_remove(ji);
@@ -570,11 +573,7 @@
}
if (jm->jm_port) {
- if (jm->transfer_bstrap) {
- jobmgr_assumes(jm, launchd_mport_deallocate(jm->jm_port) == KERN_SUCCESS);
- } else {
- jobmgr_assumes(jm, launchd_mport_close_recv(jm->jm_port) == KERN_SUCCESS);
- }
+ jobmgr_assumes(jm, launchd_mport_close_recv(jm->jm_port) == KERN_SUCCESS);
}
if (jm->jm_stdout) {
@@ -587,7 +586,6 @@
if (jm->parentmgr) {
SLIST_REMOVE(&jm->parentmgr->submgrs, jm, jobmgr_s, sle);
- jobmgr_tickle(jm->parentmgr);
} else if (getpid() == 1) {
jobmgr_assumes(jm, reboot(jm->reboot_flags) != -1);
} else {
@@ -695,7 +693,6 @@
if (job_assumes(j, j->mgr)) {
TAILQ_REMOVE(&j->mgr->jobs, j, sle);
- jobmgr_tickle(j->mgr);
}
job_log(j, LOG_DEBUG, "Removed");
@@ -1814,6 +1811,10 @@
if (fflags & NOTE_EXIT) {
job_reap(j);
job_dispatch(j, false);
+
+ if (launchd_assumes(root_jobmgr != NULL)) {
+ root_jobmgr = jobmgr_do_garbage_collection(root_jobmgr);
+ }
}
}
@@ -3247,32 +3248,45 @@
}
jobmgr_t
-jobmgr_tickle(jobmgr_t jm)
+jobmgr_do_garbage_collection(jobmgr_t jm)
{
+ jobmgr_t jmi, jmn;
job_t ji;
- if (jm->sent_stop_to_hopeful_jobs || !jm->shutting_down) {
+ SLIST_FOREACH_SAFE(jmi, &jm->submgrs, sle, jmn) {
+ jobmgr_do_garbage_collection(jmi);
+ }
+
+ if (!jm->shutting_down) {
return jm;
}
+ jobmgr_log(jm, LOG_DEBUG, "Garbage collecting.");
+
+ if (jobmgr_is_idle(jm)) {
+ jobmgr_log_stray_children(jm);
+ jobmgr_remove(jm);
+ return NULL;
+ }
+
+ if (jm->sent_stop_to_hopeful_jobs) {
+ return jm;
+ }
+
TAILQ_FOREACH(ji, &jm->jobs, sle) {
if (ji->p && !ji->hopefully_exits_last) {
return jm;
}
}
+ jobmgr_log(jm, LOG_DEBUG, "Asking \"hopeful\" jobs to exit.");
+
TAILQ_FOREACH(ji, &jm->jobs, sle) {
job_stop(ji);
}
jm->sent_stop_to_hopeful_jobs = true;
- if (jobmgr_is_idle(jm)) {
- jobmgr_log_stray_children(jm);
- jobmgr_remove(jm);
- return NULL;
- }
-
return jm;
}
@@ -3461,7 +3475,7 @@
return NULL;
}
-void
+jobmgr_t
jobmgr_delete_anything_with_port(jobmgr_t jm, mach_port_t port)
{
struct machservice *ms, *next_ms;
@@ -3478,10 +3492,6 @@
* to use.
*/
- if (jm->req_port == port) {
- jobmgr_shutdown(jm);
- }
-
SLIST_FOREACH_SAFE(jmi, &jm->submgrs, sle, jmn) {
jobmgr_delete_anything_with_port(jmi, port);
}
@@ -3493,6 +3503,12 @@
}
}
}
+
+ if (jm->req_port == port) {
+ return jobmgr_shutdown(jm);
+ }
+
+ return jm;
}
struct machservice *
@@ -3688,15 +3704,6 @@
job_dispatch(j, false);
}
-mach_port_t
-jobmgr_get_reqport(jobmgr_t jm)
-{
- jm->transfer_bstrap = true;
- gc_this_jobmgr = jm;
-
- return jm->req_port;
-}
-
jobmgr_t
job_get_bs(job_t j)
{
@@ -4609,6 +4616,8 @@
SLIST_FOREACH(ms, &j->machservices, sle) {
strlcpy(service_names[cnt2], machservice_name(ms), sizeof(service_names[0]));
ports[cnt2] = machservice_port(ms);
+ /* Increment the send right by one so we can shutdown the jobmgr cleanly */
+ jobmgr_assumes(jm, (errno = mach_port_mod_refs(mach_task_self(), ports[cnt2], MACH_PORT_RIGHT_SEND, 1)) == 0);
cnt2++;
}
@@ -4618,12 +4627,13 @@
*portsp = ports;
*servicenames_cnt = *ports_cnt = cnt;
- *reqport = jobmgr_get_reqport(jm);
+ *reqport = jm->req_port;
*rcvright = jm->jm_port;
- launchd_assumes(runtime_remove_mport(*rcvright) == KERN_SUCCESS);
+ jm->req_port = 0;
+ jm->jm_port = 0;
- launchd_assumes(launchd_mport_make_send(*rcvright) == KERN_SUCCESS);
+ jobmgr_shutdown(jm);
return BOOTSTRAP_SUCCESS;
Modified: trunk/launchd/src/launchd_core_logic.h
===================================================================
--- trunk/launchd/src/launchd_core_logic.h 2007-02-15 22:21:08 UTC (rev 23074)
+++ trunk/launchd/src/launchd_core_logic.h 2007-02-16 02:51:55 UTC (rev 23075)
@@ -27,14 +27,13 @@
typedef struct jobmgr_s *jobmgr_t;
extern jobmgr_t root_jobmgr;
-extern jobmgr_t gc_this_jobmgr;
void jobmgr_set_stdout(jobmgr_t jm, const char *what);
void jobmgr_set_stderr(jobmgr_t jm, const char *what);
jobmgr_t jobmgr_shutdown(jobmgr_t jm);
void jobmgr_dispatch_all_semaphores(jobmgr_t jm);
job_t jobmgr_find(jobmgr_t jm, const char *label);
-void jobmgr_delete_anything_with_port(jobmgr_t jm, mach_port_t port);
+jobmgr_t jobmgr_delete_anything_with_port(jobmgr_t jm, mach_port_t port);
bool jobmgr_ack_port_destruction(jobmgr_t jm, mach_port_t p);
job_t jobmgr_find_by_service_port(jobmgr_t jm, mach_port_t p);
Modified: trunk/launchd/src/launchd_runtime.c
===================================================================
--- trunk/launchd/src/launchd_runtime.c 2007-02-15 22:21:08 UTC (rev 23074)
+++ trunk/launchd/src/launchd_runtime.c 2007-02-16 02:51:55 UTC (rev 23075)
@@ -659,7 +659,9 @@
inherited_bootstrap_port = MACH_PORT_NULL;
}
- jobmgr_delete_anything_with_port(root_jobmgr, name);
+ if (launchd_assumes(root_jobmgr != NULL)) {
+ root_jobmgr = jobmgr_delete_anything_with_port(root_jobmgr, name);
+ }
/* A dead-name notification about a port appears to increment the
* rights on said port. Let's deallocate it so that we don't leak
@@ -760,12 +762,6 @@
bufRequest = bufReply;
bufReply = bufTemp;
- /* XXX - So very gross */
- if (gc_this_jobmgr) {
- jobmgr_shutdown(gc_this_jobmgr);
- gc_this_jobmgr = NULL;
- }
-
if (!(tmp_options & MACH_RCV_MSG)) {
continue;
}
Modified: trunk/launchd/src/protocol_job.defs
===================================================================
--- trunk/launchd/src/protocol_job.defs 2007-02-15 22:21:08 UTC (rev 23074)
+++ trunk/launchd/src/protocol_job.defs 2007-02-16 02:51:55 UTC (rev 23075)
@@ -31,6 +31,10 @@
import "libvproc_public.h";
import "libvproc_internal.h";
+type mach_port_move_send_array_t = array[] of mach_port_move_send_t
+ ctype: mach_port_array_t;
+
+
userprefix vproc_mig_;
serverprefix job_mig_;
@@ -85,10 +89,10 @@
routine take_subset(
__bs_port : job_t;
- out __bs_reqport : mach_port_t;
+ out __bs_reqport : mach_port_move_send_t;
out __bs_rcvright : mach_port_move_receive_t;
out __service_names : name_array_t, dealloc;
- out __service_ports : mach_port_array_t, dealloc);
+ out __service_ports : mach_port_move_send_array_t, dealloc);
routine getsocket(
__bs_port : job_t;
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.macosforge.org/pipermail/launchd-changes/attachments/20070215/58cc5421/attachment.html
More information about the launchd-changes
mailing list