Revision: 23376 http://trac.macosforge.org/projects/launchd/changeset/23376 Author: zarzycki@apple.com Date: 2007-09-12 17:48:46 -0700 (Wed, 12 Sep 2007) Log Message: ----------- <rdar://problem/5475980> The per-user launchd needs to idle exit Modified Paths: -------------- trunk/launchd/src/launchd_core_logic.c trunk/launchd/src/launchd_runtime.c trunk/launchd/src/launchd_runtime.h Modified: trunk/launchd/src/launchd_core_logic.c =================================================================== --- trunk/launchd/src/launchd_core_logic.c 2007-09-13 00:35:57 UTC (rev 23375) +++ trunk/launchd/src/launchd_core_logic.c 2007-09-13 00:48:46 UTC (rev 23376) @@ -93,7 +93,6 @@ #include "job_reply.h" #define LAUNCHD_MIN_JOB_RUN_TIME 10 -#define LAUNCHD_ADVISABLE_IDLE_TIMEOUT 30 #define LAUNCHD_DEFAULT_EXIT_TIMEOUT 20 #define LAUNCHD_SIGKILL_TIMER 5 @@ -450,7 +449,7 @@ static void do_file_init(void) __attribute__((constructor)); /* file local globals */ -static unsigned int total_children; +static size_t total_children; static mach_port_t the_exception_server; static bool did_first_per_user_launchd_BootCache_hack; static jobmgr_t background_jobmgr; @@ -646,7 +645,7 @@ static void still_alive_with_check(void) { - jobmgr_log(root_jobmgr, LOG_NOTICE, "Still alive with %u children.", total_children); + jobmgr_log(root_jobmgr, LOG_NOTICE, "Still alive with %lu children.", total_children); runtime_closelog(); /* hack to flush logs */ } @@ -740,6 +739,10 @@ struct mspolicy *msp; struct envitem *ei; + if (j == workaround_5477111) { + job_log(j, LOG_NOTICE, "@@@@@ Tried to remove ahead of schedule!"); + } + if (j->p && j->anonymous) { job_reap(j); } else if (j->p) { @@ -837,6 +840,7 @@ free(j->j_binpref); } if (j->start_interval) { + runtime_del_ref(); job_assumes(j, kevent_mod((uintptr_t)&j->start_interval, EVFILT_TIMER, EV_DELETE, 0, 0, NULL) != -1); } @@ -1122,7 +1126,7 @@ j->kqjob_callback = job_callback; j->mgr = jm; j->min_run_time = LAUNCHD_MIN_JOB_RUN_TIME; - j->timeout = LAUNCHD_ADVISABLE_IDLE_TIMEOUT; + j->timeout = RUNTIME_ADVISABLE_IDLE_TIMEOUT; j->exit_timeout = LAUNCHD_DEFAULT_EXIT_TIMEOUT; j->currently_ignored = true; j->ondemand = true; @@ -1460,6 +1464,7 @@ if (value <= 0) { job_log(j, LOG_WARNING, "StartInterval is not greater than zero, ignoring"); } else { + runtime_add_ref(); j->start_interval = value; } if (-1 == kevent_mod((uintptr_t)&j->start_interval, EVFILT_TIMER, EV_ADD, NOTE_SECONDS, value, j)) { @@ -1950,6 +1955,9 @@ kevent_mod((uintptr_t)&j->exit_timeout, EVFILT_TIMER, EV_DELETE, 0, 0, NULL); } + if (!j->anonymous) { + runtime_del_ref(); + } total_children--; LIST_REMOVE(j, pid_hash_sle); @@ -2388,6 +2396,7 @@ j->start_pending = false; + runtime_add_ref(); total_children++; LIST_INSERT_HEAD(&j->mgr->active_jobs[ACTIVE_JOB_HASH(c)], j, pid_hash_sle); @@ -3262,6 +3271,8 @@ calendarinterval_setalarm(j, ci); + runtime_add_ref(); + return true; } @@ -3272,6 +3283,8 @@ LIST_REMOVE(ci, global_sle); free(ci); + + runtime_del_ref(); } void @@ -3329,6 +3342,8 @@ SLIST_INSERT_HEAD(&j->sockets, sg, sle); + runtime_add_ref(); + return true; } @@ -3345,6 +3360,8 @@ free(sg->fds); free(sg); + + runtime_del_ref(); } void @@ -3542,7 +3559,7 @@ job_log(j, LOG_DEBUG, "Exited while removal was pending."); return true; } else if (j->mgr->shutting_down) { - job_log(j, LOG_DEBUG, "Exited while shutdown in progress. Processes remaining: %u", total_children); + job_log(j, LOG_DEBUG, "Exited while shutdown in progress. Processes remaining: %lu", total_children); return true; } else if (j->legacy_mach_job) { if (SLIST_EMPTY(&j->machservices)) { @@ -4559,6 +4576,8 @@ SLIST_INSERT_HEAD(&j->semaphores, si, sle); + runtime_add_ref(); + return true; } @@ -4572,6 +4591,8 @@ } free(si); + + runtime_del_ref(); } void @@ -5122,10 +5143,16 @@ break; case VPROC_GSK_START_INTERVAL: if ((unsigned int)inval > 0) { + if (j->start_interval == 0) { + runtime_add_ref(); + } j->start_interval = inval; job_assumes(j, kevent_mod((uintptr_t)&j->start_interval, EVFILT_TIMER, EV_ADD, NOTE_SECONDS, j->start_interval, j) != -1); } else if (j->start_interval) { job_assumes(j, kevent_mod((uintptr_t)&j->start_interval, EVFILT_TIMER, EV_DELETE, 0, 0, NULL) != -1); + if (j->start_interval != 0) { + runtime_del_ref(); + } j->start_interval = 0; } break; Modified: trunk/launchd/src/launchd_runtime.c =================================================================== --- trunk/launchd/src/launchd_runtime.c 2007-09-13 00:35:57 UTC (rev 23375) +++ trunk/launchd/src/launchd_runtime.c 2007-09-13 00:48:46 UTC (rev 23376) @@ -90,9 +90,10 @@ static mach_msg_size_t max_msg_size; static mig_callback *mig_cb_table; static size_t mig_cb_table_sz; -static timeout_callback runtime_idle_callback; -static mach_msg_timeout_t runtime_idle_timeout; +static timeout_callback runtime_idle_callback = launchd_shutdown; +static mach_msg_timeout_t runtime_idle_timeout = RUNTIME_ADVISABLE_IDLE_TIMEOUT * 1000; static audit_token_t *au_tok; +static size_t runtime_busy_cnt; static STAILQ_HEAD(, logmsg_s) logmsg_queue = STAILQ_HEAD_INITIALIZER(logmsg_queue); @@ -635,15 +636,15 @@ void -runtime_set_timeout(timeout_callback to_cb, mach_msg_timeout_t to) +runtime_set_timeout(timeout_callback to_cb, unsigned int sec) { - if (to == 0 || to_cb == NULL) { + if (sec == 0 || to_cb == NULL) { runtime_idle_callback = NULL; runtime_idle_timeout = 0; } runtime_idle_callback = to_cb; - runtime_idle_timeout = to; + runtime_idle_timeout = sec * 1000; } kern_return_t @@ -911,7 +912,7 @@ } } - if ((tmp_options & MACH_RCV_MSG) && runtime_idle_callback) { + if ((tmp_options & MACH_RCV_MSG) && runtime_idle_callback && (runtime_busy_cnt == 0)) { tmp_options |= MACH_RCV_TIMEOUT; if (!(tmp_options & MACH_SEND_TIMEOUT)) { @@ -1349,3 +1350,15 @@ return runtime_log_pack(outval, outvalCnt); } + +void +runtime_add_ref(void) +{ + runtime_busy_cnt++; +} + +void +runtime_del_ref(void) +{ + runtime_busy_cnt--; +} Modified: trunk/launchd/src/launchd_runtime.h =================================================================== --- trunk/launchd/src/launchd_runtime.h 2007-09-13 00:35:57 UTC (rev 23375) +++ trunk/launchd/src/launchd_runtime.h 2007-09-13 00:48:46 UTC (rev 23376) @@ -56,6 +56,9 @@ boolean_t launchd_internal_demux(mach_msg_header_t *Request, mach_msg_header_t *Reply); +void runtime_add_ref(void); +void runtime_del_ref(void); + void launchd_runtime_init(void); void launchd_runtime_init2(void); void launchd_runtime(void) __attribute__((noreturn)); @@ -63,7 +66,9 @@ int runtime_close(int fd); int runtime_fsync(int fd); -void runtime_set_timeout(timeout_callback to_cb, mach_msg_timeout_t to); +#define RUNTIME_ADVISABLE_IDLE_TIMEOUT 30 + +void runtime_set_timeout(timeout_callback to_cb, unsigned int sec); kern_return_t runtime_add_mport(mach_port_t name, mig_callback demux, mach_msg_size_t msg_size); kern_return_t runtime_remove_mport(mach_port_t name); bool runtime_get_caller_creds(struct ldcred *ldc);
participants (1)
-
source_changes@macosforge.org