[pulseaudio-discuss] [PATCH 4/4] Wrap clock_gettime and friends
Daniel Mack
daniel at caiaq.de
Sun Nov 1 12:01:38 PST 2009
On Sun, Nov 01, 2009 at 08:16:10PM +0100, Daniel Mack wrote:
> On Sat, Oct 31, 2009 at 01:41:19AM +0100, Lennart Poettering wrote:
> > On Mon, 19.10.09 12:45, Daniel Mack (daniel at caiaq.de) wrote:
> >
> > > > And clock_gettime we don't really need either. We need some kind of
> > > > accurate system timers (preferably monotonic), and on Linux we use
> > > > clock_gettime() for that. But we already have a fallback there for
> > > > gettimeofday().
> > > >
> > > > Or in other words, the current APIs pa_rtclock_get(),
> > > > pa_rtclock_hrtimer() is supposed to be the abstract API that has
> > > > different backends on different systems. I'd very much prefer if any
> > > > MacOS specific code would simply be plugged in there instead of
> > > > creating various new abstraction interfaces!
> > >
> > > Ok - what about the version below? I don't particularily like the
> > > #ifdeffery jungle, but it is a lot less code now.
> >
> > Thanks. Looks much better. I reordered things a little now and merged
> > this. Please verify that I didn't break the MacOS code while I did that!
>
> My build bails due to an undefined 'CLOCK_REALTIME', and this is because
> HAVE_CLOCK_GETTIME is also defined on Darwin.
>
> Below is a patch to fix it.
Damn, that one was broken. New version below.
Daniel
>From d36d53f6123a358cd69988f98180977e706c27e4 Mon Sep 17 00:00:00 2001
From: Daniel Mack <daniel at caiaq.de>
Date: Sun, 1 Nov 2009 20:06:08 +0100
Subject: [PATCH] core-rtclock.c: tweak OS_IS_DARWIN constraints
Move the code for OS_IS_DARWIN to the top as on Darwin,
HAVE_CLOCK_GETTIME is also defined.
---
src/pulsecore/core-rtclock.c | 75 ++++++++++++++++++++----------------------
1 files changed, 36 insertions(+), 39 deletions(-)
diff --git a/src/pulsecore/core-rtclock.c b/src/pulsecore/core-rtclock.c
index 4fe0a47..5916d96 100644
--- a/src/pulsecore/core-rtclock.c
+++ b/src/pulsecore/core-rtclock.c
@@ -54,29 +54,7 @@ pa_usec_t pa_rtclock_age(const struct timeval *tv) {
struct timeval *pa_rtclock_get(struct timeval *tv) {
-#if defined(HAVE_CLOCK_GETTIME)
- struct timespec ts;
-
-#ifdef CLOCK_MONOTONIC
- /* No locking or atomic ops for no_monotonic here */
- static pa_bool_t no_monotonic = FALSE;
-
- if (!no_monotonic)
- if (clock_gettime(CLOCK_MONOTONIC, &ts) < 0)
- no_monotonic = TRUE;
-
- if (no_monotonic)
-#endif /* CLOCK_MONOTONIC */
- pa_assert_se(clock_gettime(CLOCK_REALTIME, &ts) == 0);
-
- pa_assert(tv);
-
- tv->tv_sec = ts.tv_sec;
- tv->tv_usec = ts.tv_nsec / PA_NSEC_PER_USEC;
-
- return tv;
-
-#elif defined(OS_IS_DARWIN)
+#if defined(OS_IS_DARWIN)
static mach_timebase_info_data_t tbi;
uint64_t nticks;
uint64_t time_nsec;
@@ -99,41 +77,60 @@ struct timeval *pa_rtclock_get(struct timeval *tv) {
return tv;
-#else /* OS_IS_DARWIN */
+#elif defined(HAVE_CLOCK_GETTIME)
+ struct timespec ts;
- return pa_gettimeofday(tv);
+#ifdef CLOCK_MONOTONIC
+ /* No locking or atomic ops for no_monotonic here */
+ static pa_bool_t no_monotonic = FALSE;
-#endif
+ if (!no_monotonic)
+ if (clock_gettime(CLOCK_MONOTONIC, &ts) < 0)
+ no_monotonic = TRUE;
+
+ if (no_monotonic)
+#endif /* CLOCK_MONOTONIC */
+ pa_assert_se(clock_gettime(CLOCK_REALTIME, &ts) == 0);
+
+ pa_assert(tv);
+
+ tv->tv_sec = ts.tv_sec;
+ tv->tv_usec = ts.tv_nsec / PA_NSEC_PER_USEC;
+
+ return tv;
+#endif /* HAVE_CLOCK_GETTIME */
+
+ return pa_gettimeofday(tv);
}
pa_bool_t pa_rtclock_hrtimer(void) {
-#if defined(HAVE_CLOCK_GETTIME)
+#if defined (OS_IS_DARWIN)
+ mach_timebase_info_data_t tbi;
+ uint64_t time_nsec;
+
+ mach_timebase_info(&tbi);
+
+ /* nsec = nticks * (N/D) - we want 1 tick == resolution !? */
+ time_nsec = tbi.numer / tbi.denom;
+ return time_nsec <= (long) (PA_HRTIMER_THRESHOLD_USEC*PA_NSEC_PER_USEC);
+
+#elif defined(HAVE_CLOCK_GETTIME)
struct timespec ts;
#ifdef CLOCK_MONOTONIC
if (clock_getres(CLOCK_MONOTONIC, &ts) >= 0)
return ts.tv_sec == 0 && ts.tv_nsec <= (long) (PA_HRTIMER_THRESHOLD_USEC*PA_NSEC_PER_USEC);
+
#endif /* CLOCK_MONOTONIC */
pa_assert_se(clock_getres(CLOCK_REALTIME, &ts) == 0);
return ts.tv_sec == 0 && ts.tv_nsec <= (long) (PA_HRTIMER_THRESHOLD_USEC*PA_NSEC_PER_USEC);
-#elif defined (OS_IS_DARWIN)
- mach_timebase_info_data_t tbi;
- uint64_t time_nsec;
+#endif /* HAVE_CLOCK_GETTIME */
- mach_timebase_info(&tbi);
-
- /* nsec = nticks * (N/D) - we want 1 tick == resolution !? */
- time_nsec = tbi.numer / tbi.denom;
- return time_nsec <= (long) (PA_HRTIMER_THRESHOLD_USEC*PA_NSEC_PER_USEC);
-
-#else /* OS_IS_DARWIN */
return FALSE;
-
-#endif
}
#define TIMER_SLACK_NS (int) ((500 * PA_NSEC_PER_USEC))
--
1.6.3.3
More information about the pulseaudio-discuss
mailing list