<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" /><style type="text/css"><!--
#msg dl { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre, #msg p { overflow: auto; background: #ffc; border: 1px #fc0 solid; padding: 6px; }
#msg ul { overflow: auto; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<title>[23589] trunk/launchd/src</title>
</head>
<body>

<div id="msg">
<dl>
<dt>Revision</dt> <dd><a href="http://trac.macosforge.org/projects/launchd/changeset/23589">23589</a></dd>
<dt>Author</dt> <dd>zarzycki@apple.com</dd>
<dt>Date</dt> <dd>2008-04-02 13:57:44 -0700 (Wed, 02 Apr 2008)</dd>
</dl>

<h3>Log Message</h3>
<pre>&lt;rdar://problem/5834789&gt; Observably inaccurate logging during shutdown (exit duration)</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunklaunchdsrclaunchd_core_logicc">trunk/launchd/src/launchd_core_logic.c</a></li>
<li><a href="#trunklaunchdsrclaunchd_runtimec">trunk/launchd/src/launchd_runtime.c</a></li>
<li><a href="#trunklaunchdsrclaunchd_runtimeh">trunk/launchd/src/launchd_runtime.h</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunklaunchdsrclaunchd_core_logicc"></a>
<div class="modfile"><h4>Modified: trunk/launchd/src/launchd_core_logic.c (23588 => 23589)</h4>
<pre class="diff"><span>
<span class="info">--- 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)
</span><span class="lines">@@ -2326,13 +2326,12 @@
</span><span class="cx">         }
</span><span class="cx"> 
</span><span class="cx">         if (j-&gt;sent_sigterm_time) {
</span><del>-                uint64_t td_sec, td_usec, td = runtime_opaque_time_to_nano(runtime_get_opaque_time() - j-&gt;sent_sigterm_time);
</del><ins>+                uint64_t td_sec, td_usec, td = runtime_get_nanoseconds_since(j-&gt;sent_sigterm_time);
</ins><span class="cx"> 
</span><span class="cx">                 td_sec = td / NSEC_PER_SEC;
</span><span class="cx">                 td_usec = (td % NSEC_PER_SEC) / NSEC_PER_USEC;
</span><span class="cx"> 
</span><del>-                job_log(j, LOG_INFO, &quot;Exited %lld.%06lld seconds after %s was sent&quot;,
-                                td_sec, td_usec, signal_to_C_name(j-&gt;sent_sigkill ? SIGKILL : SIGTERM));
</del><ins>+                job_log(j, LOG_INFO, &quot;Exited %lld.%06lld seconds after %s was sent&quot;, td_sec, td_usec, signal_to_C_name(SIGTERM));
</ins><span class="cx">         }
</span><span class="cx"> 
</span><span class="cx"> #if DO_RUSAGE_SUMMATION
</span><span class="lines">@@ -2620,7 +2619,7 @@
</span><span class="cx">                 job_dispatch(j, false);
</span><span class="cx">         } else if (&amp;j-&gt;exit_timeout == ident) {
</span><span class="cx">                 if (j-&gt;sent_sigkill) {
</span><del>-                        uint64_t td = runtime_opaque_time_to_nano(runtime_get_opaque_time() - j-&gt;sent_sigterm_time);
</del><ins>+                        uint64_t td = runtime_get_nanoseconds_since(j-&gt;sent_sigterm_time);
</ins><span class="cx"> 
</span><span class="cx">                         td /= NSEC_PER_SEC;
</span><span class="cx">                         td -= j-&gt;exit_timeout;
</span><span class="lines">@@ -2752,7 +2751,7 @@
</span><span class="cx"> void
</span><span class="cx"> job_start(job_t j)
</span><span class="cx"> {
</span><del>-        uint64_t td, tnow = runtime_get_opaque_time();
</del><ins>+        uint64_t td;
</ins><span class="cx">         int spair[2];
</span><span class="cx">         int execspair[2];
</span><span class="cx">         int oepair[2];
</span><span class="lines">@@ -2770,14 +2769,12 @@
</span><span class="cx">                 return;
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        job_assumes(j, tnow &gt; j-&gt;start_time);
-
</del><span class="cx">         /*
</span><span class="cx">          * Some users adjust the wall-clock and then expect software to not notice.
</span><span class="cx">          * Therefore, launchd must use an absolute clock instead of the wall clock
</span><span class="cx">          * wherever possible.
</span><span class="cx">          */
</span><del>-        td = runtime_opaque_time_to_nano(tnow - j-&gt;start_time);
</del><ins>+        td = runtime_get_nanoseconds_since(j-&gt;start_time);
</ins><span class="cx">         td /= NSEC_PER_SEC;
</span><span class="cx"> 
</span><span class="cx">         if (j-&gt;start_time &amp;&amp; (td &lt; j-&gt;min_run_time) &amp;&amp; !j-&gt;legacy_mach_job &amp;&amp; !j-&gt;inetcompat) {
</span><span class="lines">@@ -2814,8 +2811,6 @@
</span><span class="cx">                 job_assumes(j, kevent_mod(j-&gt;log_redirect_fd, EVFILT_READ, EV_ADD, 0, 0, j) != -1);
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        j-&gt;start_time = tnow;
-
</del><span class="cx">         switch (c = runtime_fork(j-&gt;weird_bootstrap ? j-&gt;j_port : j-&gt;mgr-&gt;jm_port)) {
</span><span class="cx">         case -1:
</span><span class="cx">                 job_log_error(j, LOG_ERR, &quot;fork() failed, will try again in one second&quot;);
</span><span class="lines">@@ -2852,6 +2847,8 @@
</span><span class="cx">                 job_start_child(j);
</span><span class="cx">                 break;
</span><span class="cx">         default:
</span><ins>+                j-&gt;start_time = runtime_get_opaque_time();
+
</ins><span class="cx">                 job_log(j, LOG_DEBUG, &quot;Started as PID: %u&quot;, c);
</span><span class="cx"> 
</span><span class="cx">                 j-&gt;start_pending = false;
</span></span></pre></div>
<a id="trunklaunchdsrclaunchd_runtimec"></a>
<div class="modfile"><h4>Modified: trunk/launchd/src/launchd_runtime.c (23588 => 23589)</h4>
<pre class="diff"><span>
<span class="info">--- 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)
</span><span class="lines">@@ -117,6 +117,7 @@
</span><span class="cx"> static void do_file_init(void) __attribute__((constructor));
</span><span class="cx"> static mach_timebase_info_data_t tbi;
</span><span class="cx"> static uint64_t tbi_safe_math_max;
</span><ins>+static uint64_t time_of_mach_msg_return;
</ins><span class="cx"> static double tbi_float_val;
</span><span class="cx"> 
</span><span class="cx"> static const int sigigns[] = { SIGHUP, SIGINT, SIGPIPE, SIGALRM, SIGTERM,
</span><span class="lines">@@ -1025,6 +1026,8 @@
</span><span class="cx">                 mr = mach_msg(&amp;bufReply-&gt;Head, tmp_options, bufReply-&gt;Head.msgh_size,
</span><span class="cx">                                 msg_size, ipc_port_set, to, MACH_PORT_NULL);
</span><span class="cx"> 
</span><ins>+                time_of_mach_msg_return = runtime_get_opaque_time();
+
</ins><span class="cx">                 tmp_options = options;
</span><span class="cx"> 
</span><span class="cx">                 /* It looks like the compiler doesn't optimize switch(unlikely(...)) */
</span><span class="lines">@@ -1639,11 +1642,23 @@
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> INTERNAL_ABI uint64_t
</span><ins>+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
</ins><span class="cx"> runtime_opaque_time_to_nano(uint64_t o)
</span><span class="cx"> {
</span><del>-#if defined(__i386__)
</del><ins>+#if defined(__i386__) || defined(__x86_64__)
</ins><span class="cx">         if (unlikely(tbi.numer != tbi.denom)) {
</span><del>-#elif defined(__ppc__)
</del><ins>+#elif defined(__ppc__) || defined(__ppc64__)
</ins><span class="cx">         if (likely(tbi.numer != tbi.denom)) {
</span><span class="cx"> #else
</span><span class="cx">         if (tbi.numer != tbi.denom) {
</span></span></pre></div>
<a id="trunklaunchdsrclaunchd_runtimeh"></a>
<div class="modfile"><h4>Modified: trunk/launchd/src/launchd_runtime.h (23588 => 23589)</h4>
<pre class="diff"><span>
<span class="info">--- 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)
</span><span class="lines">@@ -187,9 +187,11 @@
</span><span class="cx"> INTERNAL_ABI void runtime_vsyslog(struct runtime_syslog_attr *attr, const char *message, va_list args) __attribute__((format(printf, 2, 0)));
</span><span class="cx"> INTERNAL_ABI void runtime_log_push(void);
</span><span class="cx"> 
</span><del>-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);
</del><ins>+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));
</ins><span class="cx"> 
</span><span class="cx"> INTERNAL_ABI kern_return_t launchd_set_bport(mach_port_t name);
</span><span class="cx"> INTERNAL_ABI kern_return_t launchd_get_bport(mach_port_t *name);
</span></span></pre>
</div>
</div>

</body>
</html>