[launchd-changes] [23594] trunk/launchd/src/launchd_core_logic.c
source_changes at macosforge.org
source_changes at macosforge.org
Tue Apr 8 13:38:15 PDT 2008
Revision: 23594
http://trac.macosforge.org/projects/launchd/changeset/23594
Author: zarzycki at apple.com
Date: 2008-04-08 13:38:15 -0700 (Tue, 08 Apr 2008)
Log Message:
-----------
Better logging at shutdown.
Modified Paths:
--------------
trunk/launchd/src/launchd_core_logic.c
Modified: trunk/launchd/src/launchd_core_logic.c
===================================================================
--- trunk/launchd/src/launchd_core_logic.c 2008-04-08 20:37:28 UTC (rev 23593)
+++ trunk/launchd/src/launchd_core_logic.c 2008-04-08 20:38:15 UTC (rev 23594)
@@ -308,6 +308,7 @@
static bool jobmgr_label_test(jobmgr_t jm, const char *str);
static void jobmgr_reap_bulk(jobmgr_t jm, struct kevent *kev);
static void jobmgr_log_stray_children(jobmgr_t jm);
+static void jobmgr_kill_stray_child(jobmgr_t jm, pid_t p);
static void jobmgr_remove(jobmgr_t jm);
static void jobmgr_dispatch_all(jobmgr_t jm, bool newmounthack);
static job_t jobmgr_init_session(jobmgr_t jm, const char *session_type, bool sflag);
@@ -595,6 +596,8 @@
if (j->exit_timeout) {
job_assumes(j, kevent_mod((uintptr_t)&j->exit_timeout, EVFILT_TIMER,
EV_ADD|EV_ONESHOT, NOTE_SECONDS, j->exit_timeout, j) != -1);
+ } else {
+ job_log(j, LOG_DEBUG, "This job has an infinite exit timeout");
}
if (j->kill_via_shmem) {
@@ -2193,11 +2196,9 @@
size_t i, kp_cnt, len = sizeof(struct kinfo_proc) * get_kern_max_proc();
struct kinfo_proc *kp;
-#if TARGET_OS_EMBEDDED
if (!do_apple_internal_logging) {
return;
}
-#endif
runtime_ktrace(RTKT_LAUNCHD_FINDING_STRAY_PG, j->p, 0, 0);
@@ -3063,11 +3064,10 @@
struct kinfo_proc *kp;
uid_t u = j->mach_uid;
-#if TARGET_OS_EMBEDDED
if (!do_apple_internal_logging) {
return;
}
-#endif
+
kp = malloc(len);
if (!job_assumes(j, kp != NULL)) {
@@ -4629,17 +4629,59 @@
}
void
+jobmgr_kill_stray_child(jobmgr_t jm, pid_t p)
+{
+ struct timespec ts = { 2, 0 };
+ uint64_t start, end, nanosec;
+ struct kevent kev;
+ int r, kq = kqueue();
+
+ if (!jobmgr_assumes(jm, kq != -1)) {
+ return;
+ }
+
+ EV_SET(&kev, p, EVFILT_PROC, EV_ADD, 0, 0, 0);
+
+ if (!jobmgr_assumes(jm, kevent(kq, &kev, 1, NULL, 0, NULL) != -1)) {
+ goto out;
+ }
+
+ start = runtime_get_opaque_time();
+
+ if (!jobmgr_assumes(jm, runtime_kill(p, SIGTERM) != -1)) {
+ goto out;
+ }
+
+ r = kevent(kq, NULL, 0, &kev, 1, &ts);
+
+ if (!jobmgr_assumes(jm, r == 0 || r == 1)) {
+ goto out;
+ }
+
+ if (r == 0 && jobmgr_assumes(jm, runtime_kill(p, SIGKILL) != -1)) {
+ jobmgr_assumes(jm, kevent(kq, NULL, 0, &kev, 1, NULL) == 1);
+ }
+
+ end = runtime_get_opaque_time();
+
+ nanosec = runtime_opaque_time_to_nano(end - start);
+
+ jobmgr_log(jm, LOG_DEBUG, "PID %u died after %llu nanoseconds", p, nanosec);
+
+out:
+ jobmgr_assumes(jm, runtime_close(kq) != -1);
+}
+
+void
jobmgr_log_stray_children(jobmgr_t jm)
{
int mib[] = { CTL_KERN, KERN_PROC, KERN_PROC_ALL };
size_t i, kp_cnt = 0, kp_skipped = 0, len = sizeof(struct kinfo_proc) * get_kern_max_proc();
struct kinfo_proc *kp;
-#if TARGET_OS_EMBEDDED
if (!do_apple_internal_logging) {
return;
}
-#endif
if (likely(jm->parentmgr || !pid1_magic)) {
return;
@@ -4671,10 +4713,7 @@
jobmgr_log(jm, LOG_WARNING, "Stray %sprocess at shutdown: PID %u PPID %u PGID %u %s", z, p_i, pp_i, pg_i, n);
- /*
- * The kernel team requested that launchd not do this for Leopard.
- * jobmgr_assumes(jm, runtime_kill(p_i, SIGKILL) != -1);
- */
+ jobmgr_kill_stray_child(jm, p_i);
}
out:
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.macosforge.org/pipermail/launchd-changes/attachments/20080408/b600f428/attachment-0001.html
More information about the launchd-changes
mailing list