[launchd-changes] [23471] trunk/launchd/src
source_changes at macosforge.org
source_changes at macosforge.org
Wed Dec 19 11:49:00 PST 2007
Revision: 23471
http://trac.macosforge.org/projects/launchd/changeset/23471
Author: zarzycki at apple.com
Date: 2007-12-19 11:48:57 -0800 (Wed, 19 Dec 2007)
Log Message:
-----------
Both Mach and Unix time concepts are weird.
We now use an 'int64_t' instead of 'struct timeval' for wall clock code.
We now wrap the 'timebase info' logic required by Mach absolute time.
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
trunk/launchd/src/libvproc_internal.h
Modified: trunk/launchd/src/launchd.c
===================================================================
--- trunk/launchd/src/launchd.c 2007-12-19 18:13:19 UTC (rev 23470)
+++ trunk/launchd/src/launchd.c 2007-12-19 19:48:57 UTC (rev 23471)
@@ -245,7 +245,7 @@
void
launchd_shutdown(void)
{
- struct timeval tvnow;
+ int64_t now;
if (shutdown_in_progress) {
return;
@@ -264,10 +264,10 @@
runtime_log_push();
- if (launchd_assumes(gettimeofday(&tvnow, NULL) != -1)) {
- runtime_syslog(LOG_NOTICE, "Shutdown began at: %lu.%06u", tvnow.tv_sec, tvnow.tv_usec);
- }
+ now = runtime_get_wall_time();
+ runtime_syslog(LOG_NOTICE, "Shutdown began at: %lld.%06llu", now / USEC_PER_SEC, now % USEC_PER_SEC);
+
launchd_assert(jobmgr_shutdown(root_jobmgr) != NULL);
}
Modified: trunk/launchd/src/launchd_core_logic.c
===================================================================
--- trunk/launchd/src/launchd_core_logic.c 2007-12-19 18:13:19 UTC (rev 23470)
+++ trunk/launchd/src/launchd_core_logic.c 2007-12-19 19:48:57 UTC (rev 23471)
@@ -23,7 +23,6 @@
#include <mach/mach.h>
#include <mach/mach_error.h>
-#include <mach/mach_time.h>
#include <mach/boolean.h>
#include <mach/message.h>
#include <mach/notify.h>
@@ -452,7 +451,6 @@
static size_t our_strhash(const char *s) __attribute__((pure));
static void extract_rcsid_substr(const char *i, char *o, size_t osz);
static void do_first_per_user_launchd_hack(void);
-static void do_file_init(void) __attribute__((constructor));
static void do_unmounts(void);
/* file local globals */
@@ -463,7 +461,6 @@
#define JOB_BOOTCACHE_HACK_CHECK(j) (j->per_user && !did_first_per_user_launchd_BootCache_hack && (j->mach_uid >= 500) && (j->mach_uid != (uid_t)-2))
static jobmgr_t background_jobmgr;
static job_t workaround_5477111;
-static mach_timebase_info_data_t tbi;
/* process wide globals */
mach_port_t inherited_bootstrap_port;
@@ -539,7 +536,7 @@
}
job_assumes(j, runtime_kill(j->p, SIGTERM) != -1);
- j->sent_sigterm_time = mach_absolute_time();
+ j->sent_sigterm_time = runtime_get_opaque_time();
if (j->exit_timeout) {
job_assumes(j, kevent_mod((uintptr_t)&j->exit_timeout, EVFILT_TIMER,
@@ -2150,7 +2147,7 @@
}
if (j->sent_sigterm_time) {
- uint64_t td_sec, td_usec, td = (mach_absolute_time() - j->sent_sigterm_time) * tbi.numer / tbi.denom;
+ uint64_t td_sec, td_usec, td = runtime_opaque_time_to_nano(runtime_get_opaque_time() - j->sent_sigterm_time);
td_sec = td / NSEC_PER_SEC;
td_usec = (td % NSEC_PER_SEC) / NSEC_PER_USEC;
@@ -2432,7 +2429,7 @@
job_dispatch(j, false);
} else if (&j->exit_timeout == ident) {
if (j->sent_sigkill) {
- uint64_t td = (mach_absolute_time() - j->sent_sigterm_time) * tbi.numer / tbi.denom;
+ uint64_t td = runtime_opaque_time_to_nano(runtime_get_opaque_time() - j->sent_sigterm_time);
td /= NSEC_PER_SEC;
td -= j->exit_timeout;
@@ -2481,7 +2478,6 @@
void
jobmgr_callback(void *obj, struct kevent *kev)
{
- struct timeval tvnow;
jobmgr_t jm = obj;
job_t ji;
@@ -2504,8 +2500,11 @@
runtime_closelog(); /* HACK -- force 'start' time to be set */
- if (getpid() == 1 && jobmgr_assumes(jm, gettimeofday(&tvnow, NULL) != -1)) {
- jobmgr_log(jm, LOG_NOTICE, "Anticipatory shutdown began at: %lu.%06u", tvnow.tv_sec, tvnow.tv_usec);
+ if (getpid() == 1) {
+ int64_t now = runtime_get_wall_time();
+
+ jobmgr_log(jm, LOG_NOTICE, "Anticipatory shutdown began at: %lld.%06llu", now / USEC_PER_SEC, now % USEC_PER_SEC);
+
LIST_FOREACH(ji, &root_jobmgr->jobs, sle) {
if (ji->per_user && ji->p) {
job_assumes(ji, runtime_kill(ji->p, SIGUSR2) != -1);
@@ -2562,7 +2561,7 @@
void
job_start(job_t j)
{
- uint64_t td, tnow = mach_absolute_time();
+ uint64_t td, tnow = runtime_get_opaque_time();
int spair[2];
int execspair[2];
int oepair[2];
@@ -2584,10 +2583,10 @@
/*
* Some users adjust the wall-clock and then expect software to not notice.
- * Therefore, launchd must use an absolute clock instead of gettimeofday()
- * or time() wherever possible.
+ * Therefore, launchd must use an absolute clock instead of the wall clock
+ * wherever possible.
*/
- td = (tnow - j->start_time) * tbi.numer / tbi.denom;
+ td = runtime_opaque_time_to_nano(tnow - j->start_time);
td /= NSEC_PER_SEC;
if (j->start_time && (td < j->min_run_time) && !j->legacy_mach_job && !j->inetcompat) {
@@ -6737,13 +6736,6 @@
}
void
-do_file_init(void)
-{
- launchd_assert(mach_timebase_info(&tbi) == 0);
-
-}
-
-void
do_unmounts(void)
{
struct statfs buf[250];
Modified: trunk/launchd/src/launchd_runtime.c
===================================================================
--- trunk/launchd/src/launchd_runtime.c 2007-12-19 18:13:19 UTC (rev 23470)
+++ trunk/launchd/src/launchd_runtime.c 2007-12-19 19:48:57 UTC (rev 23471)
@@ -33,6 +33,7 @@
#include <mach/mach_interface.h>
#include <mach/host_info.h>
#include <mach/mach_host.h>
+#include <mach/mach_time.h>
#include <mach/exception.h>
#include <sys/types.h>
#include <sys/stat.h>
@@ -109,6 +110,8 @@
static bool logmsg_add(struct runtime_syslog_attr *attr, int err_num, const char *msg);
static void logmsg_remove(struct logmsg_s *lm);
+static void do_file_init(void) __attribute__((constructor));
+static mach_timebase_info_data_t tbi;
static const int sigigns[] = { SIGHUP, SIGINT, SIGPIPE, SIGALRM, SIGTERM,
SIGURG, SIGTSTP, SIGTSTP, SIGCONT, SIGTTIN, SIGTTOU, SIGIO, SIGXCPU,
@@ -1209,7 +1212,7 @@
data_off = lm->data;
- launchd_assumes(gettimeofday(&lm->when, NULL) != -1);
+ lm->when = runtime_get_wall_time();
lm->from_pid = attr->from_pid;
lm->about_pid = attr->about_pid;
lm->err_num = err_num;
@@ -1307,8 +1310,7 @@
runtime_log_push(void)
{
static pthread_mutex_t ourlock = PTHREAD_MUTEX_INITIALIZER;
- static struct timeval shutdown_start;
- struct timeval tvd;
+ static int64_t shutdown_start, log_delta;
mach_msg_type_number_t outvalCnt;
struct logmsg_s *lm;
vm_offset_t outval;
@@ -1329,8 +1331,8 @@
return;
}
- if (shutdown_start.tv_sec == 0) {
- gettimeofday(&shutdown_start, NULL);
+ if (shutdown_start == 0) {
+ shutdown_start = runtime_get_wall_time();
launchd_log_vm_stats();
}
@@ -1349,15 +1351,9 @@
}
while ((lm = STAILQ_FIRST(&logmsg_queue))) {
- timersub(&lm->when, &shutdown_start, &tvd);
+ log_delta = lm->when - shutdown_start;
- /* don't ask */
- if (tvd.tv_sec < 0) {
- tvd.tv_sec = 0;
- tvd.tv_usec = 0;
- }
-
- fprintf(ourlogfile, "%3ld.%06d%6u %-40s%6u %-40s %s\n", tvd.tv_sec, tvd.tv_usec,
+ fprintf(ourlogfile, "%8lld%6u %-40s%6u %-40s %s\n", log_delta,
lm->from_pid, lm->from_name, lm->about_pid, lm->about_name, lm->msg);
logmsg_remove(lm);
@@ -1550,3 +1546,55 @@
return (apple_internal_logging == 0);
}
+
+int64_t
+runtime_get_wall_time(void)
+{
+ struct timeval tv;
+ int64_t r;
+
+ launchd_assumes(gettimeofday(&tv, NULL) != -1);
+
+ r = tv.tv_sec;
+ r *= USEC_PER_SEC;
+ r += tv.tv_usec;
+
+ return r;
+}
+
+uint64_t
+runtime_get_opaque_time(void)
+{
+ return mach_absolute_time();
+}
+
+uint64_t
+runtime_opaque_time_to_nano(uint64_t o)
+{
+#if defined(__i386__)
+ if (unlikely(tbi.numer != tbi.denom)) {
+#elif defined(__ppc__)
+ if (likely(tbi.numer != tbi.denom)) {
+#else
+ if (tbi.numer != tbi.denom) {
+#endif
+ if (o < INT32_MAX) {
+ o *= tbi.numer;
+ o /= tbi.denom;
+ } else {
+ double d = o;
+ d *= tbi.numer;
+ d /= tbi.denom;
+ o = d;
+ }
+ }
+
+ return o;
+}
+
+void
+do_file_init(void)
+{
+ launchd_assert(mach_timebase_info(&tbi) == 0);
+}
+
Modified: trunk/launchd/src/launchd_runtime.h
===================================================================
--- trunk/launchd/src/launchd_runtime.h 2007-12-19 18:13:19 UTC (rev 23470)
+++ trunk/launchd/src/launchd_runtime.h 2007-12-19 19:48:57 UTC (rev 23471)
@@ -70,6 +70,8 @@
#endif
+#define likely(x) __builtin_expect((bool)(x), true)
+#define unlikely(x) __builtin_expect((bool)(x), false)
struct ldcred {
uid_t euid;
@@ -151,7 +153,11 @@
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);
+uint64_t runtime_get_opaque_time(void);
+uint64_t runtime_opaque_time_to_nano(uint64_t o);
+
kern_return_t launchd_set_bport(mach_port_t name);
kern_return_t launchd_get_bport(mach_port_t *name);
kern_return_t launchd_mport_notify_req(mach_port_t name, mach_msg_id_t which);
Modified: trunk/launchd/src/libvproc_internal.h
===================================================================
--- trunk/launchd/src/libvproc_internal.h 2007-12-19 18:13:19 UTC (rev 23470)
+++ trunk/launchd/src/libvproc_internal.h 2007-12-19 19:48:57 UTC (rev 23471)
@@ -59,7 +59,7 @@
struct logmsg_s {
STAILQ_ENTRY(logmsg_s) sqe;
- struct timeval when;
+ int64_t when;
pid_t from_pid;
pid_t about_pid;
uid_t sender_uid;
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.macosforge.org/pipermail/launchd-changes/attachments/20071219/50066de9/attachment.html
More information about the launchd-changes
mailing list