[launchd-changes] [23589] trunk/launchd/src

source_changes at macosforge.org source_changes at macosforge.org
Wed Apr 2 13:57:46 PDT 2008


Revision: 23589
          http://trac.macosforge.org/projects/launchd/changeset/23589
Author:   zarzycki at apple.com
Date:     2008-04-02 13:57:44 -0700 (Wed, 02 Apr 2008)

Log Message:
-----------
<rdar://problem/5834789> Observably inaccurate logging during shutdown (exit duration)

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	2008-04-02 20:26:26 UTC (rev 23588)
+++ trunk/launchd/src/launchd_core_logic.c	2008-04-02 20:57:44 UTC (rev 23589)
@@ -2326,13 +2326,12 @@
 	}
 
 	if (j->sent_sigterm_time) {
-		uint64_t td_sec, td_usec, td = runtime_opaque_time_to_nano(runtime_get_opaque_time() - j->sent_sigterm_time);
+		uint64_t td_sec, td_usec, td = runtime_get_nanoseconds_since(j->sent_sigterm_time);
 
 		td_sec = td / NSEC_PER_SEC;
 		td_usec = (td % NSEC_PER_SEC) / NSEC_PER_USEC;
 
-		job_log(j, LOG_INFO, "Exited %lld.%06lld seconds after %s was sent",
-				td_sec, td_usec, signal_to_C_name(j->sent_sigkill ? SIGKILL : SIGTERM));
+		job_log(j, LOG_INFO, "Exited %lld.%06lld seconds after %s was sent", td_sec, td_usec, signal_to_C_name(SIGTERM));
 	}
 
 #if DO_RUSAGE_SUMMATION
@@ -2620,7 +2619,7 @@
 		job_dispatch(j, false);
 	} else if (&j->exit_timeout == ident) {
 		if (j->sent_sigkill) {
-			uint64_t td = runtime_opaque_time_to_nano(runtime_get_opaque_time() - j->sent_sigterm_time);
+			uint64_t td = runtime_get_nanoseconds_since(j->sent_sigterm_time);
 
 			td /= NSEC_PER_SEC;
 			td -= j->exit_timeout;
@@ -2752,7 +2751,7 @@
 void
 job_start(job_t j)
 {
-	uint64_t td, tnow = runtime_get_opaque_time();
+	uint64_t td;
 	int spair[2];
 	int execspair[2];
 	int oepair[2];
@@ -2770,14 +2769,12 @@
 		return;
 	}
 
-	job_assumes(j, tnow > j->start_time);
-
 	/*
 	 * Some users adjust the wall-clock and then expect software to not notice.
 	 * Therefore, launchd must use an absolute clock instead of the wall clock
 	 * wherever possible.
 	 */
-	td = runtime_opaque_time_to_nano(tnow - j->start_time);
+	td = runtime_get_nanoseconds_since(j->start_time);
 	td /= NSEC_PER_SEC;
 
 	if (j->start_time && (td < j->min_run_time) && !j->legacy_mach_job && !j->inetcompat) {
@@ -2814,8 +2811,6 @@
 		job_assumes(j, kevent_mod(j->log_redirect_fd, EVFILT_READ, EV_ADD, 0, 0, j) != -1);
 	}
 
-	j->start_time = tnow;
-
 	switch (c = runtime_fork(j->weird_bootstrap ? j->j_port : j->mgr->jm_port)) {
 	case -1:
 		job_log_error(j, LOG_ERR, "fork() failed, will try again in one second");
@@ -2852,6 +2847,8 @@
 		job_start_child(j);
 		break;
 	default:
+		j->start_time = runtime_get_opaque_time();
+
 		job_log(j, LOG_DEBUG, "Started as PID: %u", c);
 
 		j->start_pending = false;

Modified: trunk/launchd/src/launchd_runtime.c
===================================================================
--- trunk/launchd/src/launchd_runtime.c	2008-04-02 20:26:26 UTC (rev 23588)
+++ trunk/launchd/src/launchd_runtime.c	2008-04-02 20:57:44 UTC (rev 23589)
@@ -117,6 +117,7 @@
 static void do_file_init(void) __attribute__((constructor));
 static mach_timebase_info_data_t tbi;
 static uint64_t tbi_safe_math_max;
+static uint64_t time_of_mach_msg_return;
 static double tbi_float_val;
 
 static const int sigigns[] = { SIGHUP, SIGINT, SIGPIPE, SIGALRM, SIGTERM,
@@ -1025,6 +1026,8 @@
 		mr = mach_msg(&bufReply->Head, tmp_options, bufReply->Head.msgh_size,
 				msg_size, ipc_port_set, to, MACH_PORT_NULL);
 
+		time_of_mach_msg_return = runtime_get_opaque_time();
+
 		tmp_options = options;
 
 		/* It looks like the compiler doesn't optimize switch(unlikely(...)) */
@@ -1639,11 +1642,23 @@
 }
 
 INTERNAL_ABI uint64_t
+runtime_get_opaque_time_of_event(void)
+{
+	return time_of_mach_msg_return;
+}
+
+INTERNAL_ABI uint64_t
+runtime_get_nanoseconds_since(uint64_t o)
+{
+	return runtime_opaque_time_to_nano(runtime_get_opaque_time_of_event() - o);
+}
+
+INTERNAL_ABI uint64_t
 runtime_opaque_time_to_nano(uint64_t o)
 {
-#if defined(__i386__)
+#if defined(__i386__) || defined(__x86_64__)
 	if (unlikely(tbi.numer != tbi.denom)) {
-#elif defined(__ppc__)
+#elif defined(__ppc__) || defined(__ppc64__)
 	if (likely(tbi.numer != tbi.denom)) {
 #else
 	if (tbi.numer != tbi.denom) {

Modified: trunk/launchd/src/launchd_runtime.h
===================================================================
--- trunk/launchd/src/launchd_runtime.h	2008-04-02 20:26:26 UTC (rev 23588)
+++ trunk/launchd/src/launchd_runtime.h	2008-04-02 20:57:44 UTC (rev 23589)
@@ -187,9 +187,11 @@
 INTERNAL_ABI void runtime_vsyslog(struct runtime_syslog_attr *attr, const char *message, va_list args) __attribute__((format(printf, 2, 0)));
 INTERNAL_ABI void runtime_log_push(void);
 
-INTERNAL_ABI int64_t runtime_get_wall_time(void);
-INTERNAL_ABI uint64_t runtime_get_opaque_time(void);
-INTERNAL_ABI uint64_t runtime_opaque_time_to_nano(uint64_t o);
+INTERNAL_ABI int64_t runtime_get_wall_time(void) __attribute__((warn_unused_result));
+INTERNAL_ABI uint64_t runtime_get_opaque_time(void) __attribute__((warn_unused_result));
+INTERNAL_ABI uint64_t runtime_get_opaque_time_of_event(void) __attribute__((pure, warn_unused_result));
+INTERNAL_ABI uint64_t runtime_opaque_time_to_nano(uint64_t o) __attribute__((const, warn_unused_result));
+INTERNAL_ABI uint64_t runtime_get_nanoseconds_since(uint64_t o) __attribute__((pure, warn_unused_result));
 
 INTERNAL_ABI kern_return_t launchd_set_bport(mach_port_t name);
 INTERNAL_ABI kern_return_t launchd_get_bport(mach_port_t *name);

-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.macosforge.org/pipermail/launchd-changes/attachments/20080402/5cd087dc/attachment.html


More information about the launchd-changes mailing list