[libdispatch-changes] [132] trunk
source_changes at macosforge.org
source_changes at macosforge.org
Wed Nov 4 14:44:26 PST 2009
Revision: 132
http://trac.macosforge.org/projects/libdispatch/changeset/132
Author: robert at fledge.watson.org
Date: 2009-11-04 14:44:23 -0800 (Wed, 04 Nov 2009)
Log Message:
-----------
Rework conversion of timeouts to sem_timedwait() arguments further:
reintroduce tests for CLOCK_UPTIME/CLOCK_MONOTONIC, and restore using
them for absolute times on non-Mac OS X systems; instead perform a
more mature but more costly conversion when calculating a timeout.
Perhaps we should cache the delta between our absolute clock and the
realtime clock to avoid a clock read each time we calculate a timeout.
This should re-eliminate the restriction that POSIX semaphores can't
be used on systems where we use mach_absolute_time().
Modified Paths:
--------------
trunk/configure.ac
trunk/src/shims/time.h
trunk/src/time.c
Modified: trunk/configure.ac
===================================================================
--- trunk/configure.ac 2009-11-04 21:15:54 UTC (rev 131)
+++ trunk/configure.ac 2009-11-04 22:44:23 UTC (rev 132)
@@ -177,7 +177,8 @@
#
# Find functions and declarations we care about.
#
-AC_CHECK_DECLS([CLOCK_REALTIME], [], [], [[#include <time.h>]])
+AC_CHECK_DECLS([CLOCK_UPTIME, CLOCK_MONOTONIC, CLOCK_REALTIME], [], [],
+ [[#include <time.h>]])
AC_CHECK_DECLS([EVFILT_SESSION, NOTE_NONE, NOTE_REAP, NOTE_SIGNAL], [], [],
[[#include <sys/event.h>]])
AC_CHECK_DECLS([FD_COPY], [], [], [[#include <sys/select.h>]])
Modified: trunk/src/shims/time.h
===================================================================
--- trunk/src/shims/time.h 2009-11-04 21:15:54 UTC (rev 131)
+++ trunk/src/shims/time.h 2009-11-04 22:44:23 UTC (rev 132)
@@ -43,7 +43,13 @@
struct timespec ts;
int ret;
- ret = clock_gettime(CLOCK_REALTIME, &ts);
+#if HAVE_DECL_CLOCK_UPTIME
+ ret = clock_gettime(CLOCK_UPTIME, &ts);
+#elif HAVE_DECL_CLOCK_MONOTONIC
+ ret = clock_gettime(CLOCK_MONOTONIC, &ts);
+#else
+#error "clock_gettime: no supported absolute time clock"
+#endif
(void)dispatch_assume_zero(ret);
/* XXXRW: Some kind of overflow detection needed? */
Modified: trunk/src/time.c
===================================================================
--- trunk/src/time.c 2009-11-04 21:15:54 UTC (rev 131)
+++ trunk/src/time.c 2009-11-04 22:44:23 UTC (rev 132)
@@ -184,44 +184,47 @@
}
#if USE_POSIX_SEM
-#ifdef HAVE_MACH_ABSOLUTE_TIME
-#error "Cannot currently use USE_POSIX_SEM and HAVE_MACH_ABSOLUTE_TIME together"
-#endif
/*
* Unlike Mach semaphores, POSIX semaphores take an absolute, real time as an
* argument to sem_timedwait(). This routine converts from dispatch_time_t
* but assumes the caller has already handled the possibility of
* DISPATCH_TIME_FOREVER.
- *
- * XXXRW: Does not currently with with mach_absolute_time()/
*/
struct timespec
_dispatch_timeout_ts(dispatch_time_t when)
{
- struct timespec ts;
+ struct timespec ts_realtime;
+ uint64_t abstime;
int ret;
+ printf("_dispatch_timeout_ts: req %ld\n", (int64_t)when);
+
if (when == 0) {
- when = _dispatch_absolute_time();
- ts.tv_sec = when / NSEC_PER_SEC;
- ts.tv_nsec = when % NSEC_PER_SEC;
- return (ts);
+ ret = clock_gettime(CLOCK_REALTIME, &ts_realtime);
+ (void)dispatch_assume_zero(ret);
+ return (ts_realtime);
}
if ((int64_t)when < 0) {
- when = -(int64_t)when + _dispatch_absolute_time();
- ts.tv_sec = when / NSEC_PER_SEC;
- ts.tv_nsec = when % NSEC_PER_SEC;
- return (ts);
+ ret = clock_gettime(CLOCK_REALTIME, &ts_realtime);
+ (void)dispatch_assume_zero(ret);
+ when = -(int64_t)when + ts_realtime.tv_sec * NSEC_PER_SEC +
+ ts_realtime.tv_nsec;
+ ts_realtime.tv_sec = when / NSEC_PER_SEC;
+ ts_realtime.tv_nsec = when % NSEC_PER_SEC;
+ return (ts_realtime);
}
/*
- * XXXRW: This code assumes that dispatch_time_t absolute times are
- * with respect to CLOCK_REALTIME. If we want to support
- * USE_POSIX_SEM with mach_absolute_time(), a conversion is required
- * here.
+ * Rebase 'when': (when - abstime) + realtime.
+ *
+ * XXXRW: Should we cache this delta to avoid system calls?
*/
- ts.tv_sec = when / NSEC_PER_SEC;
- ts.tv_nsec = when % NSEC_PER_SEC;
- return (ts);
+ abstime = _dispatch_absolute_time();
+ ret = clock_gettime(CLOCK_REALTIME, &ts_realtime);
+ (void)dispatch_assume_zero(ret);
+ printf("now is %d.%lu\n", ts_realtime.tv_sec, ts_realtime.tv_nsec);
+ ts_realtime.tv_sec += (when - abstime) / NSEC_PER_SEC;
+ ts_realtime.tv_nsec += (when - abstime) % NSEC_PER_SEC;
+ return (ts_realtime);
}
#endif
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/libdispatch-changes/attachments/20091104/e3d41a74/attachment.html>
More information about the libdispatch-changes
mailing list