Revision: 23916 http://trac.macosforge.org/projects/launchd/changeset/23916 Author: dsorresso@apple.com Date: 2009-05-01 10:47:54 -0700 (Fri, 01 May 2009) Log Message: ----------- <rdar://problem/6845376> We're still leaving zombies around when logging out Modified Paths: -------------- trunk/launchd/src/launchd.c trunk/launchd/src/launchd_core_logic.c trunk/launchd/src/launchd_runtime.c trunk/launchd/src/launchd_runtime.h Modified: trunk/launchd/src/launchd.c =================================================================== --- trunk/launchd/src/launchd.c 2009-04-30 23:34:49 UTC (rev 23915) +++ trunk/launchd/src/launchd.c 2009-05-01 17:47:54 UTC (rev 23916) @@ -164,15 +164,9 @@ if( pid1_magic ) { if( low_level_debug ) { g_console = stdout; - } else { - if( !launchd_assumes((g_console = fopen(_PATH_CONSOLE, "w")) != NULL) ) { - g_console = stdout; - } else { - _fd(fileno(g_console)); - } + } else if( launchd_assumes((g_console = fopen(_PATH_CONSOLE, "w")) != NULL) ) { + _fd(fileno(g_console)); } - } else { - g_console = stdout; } if (NULL == getenv("PATH")) { @@ -205,9 +199,9 @@ } if( pid1_magic ) { - runtime_syslog(LOG_NOTICE | LOG_CONSOLE_FORCE, "*** launchd[1] has started up. ***"); + runtime_syslog(LOG_NOTICE | LOG_CONSOLE, "*** launchd[1] has started up. ***"); if( g_use_gmalloc ) { - runtime_syslog(LOG_NOTICE | LOG_CONSOLE_FORCE, "*** Using libgmalloc ***"); + runtime_syslog(LOG_NOTICE | LOG_CONSOLE, "*** Using libgmalloc ***"); } if( g_verbose_boot ) { @@ -215,7 +209,7 @@ } if( g_shutdown_debugging ) { - runtime_syslog(LOG_NOTICE | LOG_CONSOLE_FORCE, "*** Shutdown debugging is enabled. ***"); + runtime_syslog(LOG_NOTICE | LOG_CONSOLE, "*** Shutdown debugging is enabled. ***"); } /* PID 1 doesn't have a flat namespace. */ @@ -304,7 +298,7 @@ switch ((p = fork())) { case -1: - runtime_syslog(LOG_ERR | LOG_CONSOLE_FORCE, "Can't fork PID 1 copy for crash debugging: %m"); + runtime_syslog(LOG_ERR | LOG_CONSOLE, "Can't fork PID 1 copy for crash debugging: %m"); return p; case 0: return p; @@ -339,10 +333,14 @@ /* Neuter our bootstrap port so that the shell doesn't try talking to us while * we're blocked waiting on it. */ - fflush(g_console); + if( g_console ) { + fflush(g_console); + } task_set_bootstrap_port(mach_task_self(), MACH_PORT_NULL); if( basic_fork() != 0 ) { - fflush(g_console); + if( g_console ) { + fflush(g_console); + } return true; } } else { @@ -435,7 +433,7 @@ }; if( !launchd_assumes(setaudit_addr(&auinfo, sizeof(auinfo)) != -1) ) { - runtime_syslog(LOG_WARNING | LOG_CONSOLE_FORCE, "Could not set audit session: %s.", strerror(errno)); + runtime_syslog(LOG_WARNING | LOG_CONSOLE, "Could not set audit session: %s.", strerror(errno)); _exit(EXIT_FAILURE); } Modified: trunk/launchd/src/launchd_core_logic.c =================================================================== --- trunk/launchd/src/launchd_core_logic.c 2009-04-30 23:34:49 UTC (rev 23915) +++ trunk/launchd/src/launchd_core_logic.c 2009-05-01 17:47:54 UTC (rev 23916) @@ -3057,7 +3057,7 @@ va_list ap; va_start(ap, msg); - runtime_vsyslog(&attr, false, msg, ap); + runtime_vsyslog(&attr, msg, ap); va_end(ap); } @@ -3499,7 +3499,7 @@ jobmgr_assumes(root_jobmgr, runtime_close(s_no_hang_fd) != -1); s_no_hang_fd = _fd(_no_hang_fd); } - } else if( kev->ident == (uintptr_t)fileno(g_console) ) { + } else if( pid1_magic && g_console && kev->ident == (uintptr_t)fileno(g_console) ) { int cfd = -1; if( low_level_debug ) { if( jobmgr_assumes(jm, (stdout = freopen(_PATH_CONSOLE, "w", stdout)) != NULL) ) { @@ -3511,8 +3511,11 @@ cfd = fileno(g_console); } } - jobmgr_assumes(jm, kevent_mod((uintptr_t)cfd, EVFILT_VNODE, EV_ADD | EV_ONESHOT, NOTE_REVOKE, 0, jm) != -1); - _fd(cfd); + + if( cfd != -1 ) { + jobmgr_assumes(jm, kevent_mod((uintptr_t)cfd, EVFILT_VNODE, EV_ADD | EV_ONESHOT, NOTE_REVOKE, 0, jm) != -1); + _fd(cfd); + } } break; default: @@ -4382,12 +4385,9 @@ void job_logv(job_t j, int pri, int err, const char *msg, va_list ap) { - bool log_to_console = pri & LOG_CONSOLE; - int _pri = pri & ~LOG_CONSOLE; - const char *label2use = j ? j->label : "com.apple.launchd.NULL"; const char *mgr2use = j ? j->mgr->name : "NULL"; - struct runtime_syslog_attr attr = { g_my_label, label2use, mgr2use, _pri, getuid(), getpid(), j ? j->p : 0 }; + struct runtime_syslog_attr attr = { g_my_label, label2use, mgr2use, pri, getuid(), getpid(), j ? j->p : 0 }; char *newmsg; int oldmask = 0; size_t newmsgsz; @@ -4422,7 +4422,7 @@ oldmask = setlogmask(LOG_UPTO(LOG_DEBUG)); } - runtime_vsyslog(&attr, log_to_console, newmsg, ap); + runtime_vsyslog(&attr, newmsg, ap); if( j && unlikely(j->debug) ) { setlogmask(oldmask); @@ -4500,12 +4500,9 @@ if (jm->parentmgr) { jobmgr_logv(jm->parentmgr, pri, 0, newmsg, ap); } else { - bool log_to_console = pri & LOG_CONSOLE; - int _pri = pri & ~LOG_CONSOLE; - - struct runtime_syslog_attr attr = { g_my_label, g_my_label, jm->name, _pri, getuid(), getpid(), getpid() }; + struct runtime_syslog_attr attr = { g_my_label, g_my_label, jm->name, pri, getuid(), getpid(), getpid() }; - runtime_vsyslog(&attr, log_to_console, newmsg, ap); + runtime_vsyslog(&attr, newmsg, ap); } } @@ -5595,16 +5592,20 @@ if( !ji->stopped ) { job_log(ji, LOG_DEBUG, "Stopping job."); job_stop(ji); - if( !ji->clean_kill ) { - unkilled_cnt++; - } + unkilled_cnt++; } else { if( ji->clean_kill ) { job_log(ji, LOG_DEBUG, "Job was clean and sent SIGKILL."); + if( !ji->clean_exit_timer_expired ) { + /* Give jobs that were clean and sent SIGKILL 1 second to exit after receipt. */ + unkilled_cnt++; + } else { + job_log(ji, LOG_ERR, "Job was clean, killed and has not exited after 1 second. Moving on."); + } } else { job_log(ji, LOG_DEBUG, "Job was sent SIGTERM%s.", ji->sent_sigkill ? " and SIGKILL" : ""); + unkilled_cnt += !ji->sent_sigkill; } - unkilled_cnt += !ji->sent_sigkill; } } else { job_log(ji, LOG_DEBUG, "Job is active: %s", active); @@ -5960,7 +5961,9 @@ bootstrapper->stdoutpath = strdup(_PATH_CONSOLE); bootstrapper->stderrpath = strdup(_PATH_CONSOLE); - jobmgr_assumes(jm, kevent_mod((uintptr_t)fileno(g_console), EVFILT_VNODE, EV_ADD | EV_ONESHOT, NOTE_REVOKE, 0, jm) != -1); + if( g_console ) { + jobmgr_assumes(jm, kevent_mod((uintptr_t)fileno(g_console), EVFILT_VNODE, EV_ADD | EV_ONESHOT, NOTE_REVOKE, 0, jm) != -1); + } } } Modified: trunk/launchd/src/launchd_runtime.c =================================================================== --- trunk/launchd/src/launchd_runtime.c 2009-04-30 23:34:49 UTC (rev 23915) +++ trunk/launchd/src/launchd_runtime.c 2009-05-01 17:47:54 UTC (rev 23916) @@ -1246,14 +1246,11 @@ void runtime_syslog(int pri, const char *message, ...) { - bool log_to_console = (( pri & LOG_CONSOLE ) && g_verbose_boot) || ( pri & LOG_CONSOLE_FORCE ); - int _pri = pri & ~(LOG_CONSOLE | LOG_CONSOLE_FORCE); - struct runtime_syslog_attr attr = { g_my_label, g_my_label, pid1_magic ? "System" : "Background", - _pri, + pri, getuid(), getpid(), getpid() @@ -1261,16 +1258,17 @@ va_list ap; va_start(ap, message); - runtime_vsyslog(&attr, log_to_console, message, ap); + runtime_vsyslog(&attr, message, ap); va_end(ap); } void -runtime_vsyslog(struct runtime_syslog_attr *attr, bool echo_to_console, const char *message, va_list args) +runtime_vsyslog(struct runtime_syslog_attr *attr, const char *message, va_list args) { int saved_errno = errno; char newmsg[10000]; + bool echo_to_console= false; if (attr->priority == LOG_APPLEONLY) { if (do_apple_internal_logging) { @@ -1282,6 +1280,11 @@ attr->priority = g_log_strict_usage ? LOG_NOTICE : LOG_DEBUG; } + if( attr->priority & LOG_CONSOLE ) { + echo_to_console = true; + attr->priority &= ~LOG_CONSOLE; + } + if (!(LOG_MASK(attr->priority) & internal_mask_pri)) { return; } Modified: trunk/launchd/src/launchd_runtime.h =================================================================== --- trunk/launchd/src/launchd_runtime.h 2009-04-30 23:34:49 UTC (rev 23915) +++ trunk/launchd/src/launchd_runtime.h 2009-05-01 17:47:54 UTC (rev 23916) @@ -153,7 +153,6 @@ #define LOG_APPLEONLY 0x4141504c /* AAPL in hex */ #define LOG_SCOLDING 0x3030493b #define LOG_CONSOLE (1 << 31) -#define LOG_CONSOLE_FORCE (1 << 30) struct runtime_syslog_attr { const char *from_name; @@ -168,7 +167,7 @@ int runtime_setlogmask(int maskpri); void runtime_closelog(void); void runtime_syslog(int pri, const char *message, ...) __attribute__((format(printf, 2, 3))); -void runtime_vsyslog(struct runtime_syslog_attr *attr, bool log_to_console, const char *message, va_list args) __attribute__((format(printf, 3, 0))); +void runtime_vsyslog(struct runtime_syslog_attr *attr, const char *message, va_list args) __attribute__((format(printf, 2, 0))); void runtime_log_push(void); int64_t runtime_get_wall_time(void) __attribute__((warn_unused_result));
participants (1)
-
source_changes@macosforge.org