summaryrefslogtreecommitdiffstats
path: root/src/pulsecore
diff options
context:
space:
mode:
authorDaniel Mack <daniel@caiaq.de>2009-11-01 20:06:08 +0100
committerDaniel Mack <daniel@caiaq.de>2009-12-09 06:31:07 +0800
commita46ddfebb592852ff791bc90b3953880c49073dd (patch)
tree0e2d8c31c6646834e0ef60fcdd4c6e2375156f55 /src/pulsecore
parent76acaa964e01d119c39ff617691179d54805b412 (diff)
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.
Diffstat (limited to 'src/pulsecore')
-rw-r--r--src/pulsecore/core-rtclock.c69
1 files changed, 28 insertions, 41 deletions
diff --git a/src/pulsecore/core-rtclock.c b/src/pulsecore/core-rtclock.c
index 4fe0a47b..110158ba 100644
--- a/src/pulsecore/core-rtclock.c
+++ b/src/pulsecore/core-rtclock.c
@@ -37,6 +37,7 @@
#include <CoreServices/CoreServices.h>
#include <mach/mach.h>
#include <mach/mach_time.h>
+#include <unistd.h>
#endif
#include <pulse/timeval.h>
@@ -54,7 +55,19 @@ pa_usec_t pa_rtclock_age(const struct timeval *tv) {
struct timeval *pa_rtclock_get(struct timeval *tv) {
-#if defined(HAVE_CLOCK_GETTIME)
+#if defined(OS_IS_DARWIN)
+ uint64_t val, abs_time = mach_absolute_time();
+ Nanoseconds nanos;
+
+ nanos = AbsoluteToNanoseconds(*(AbsoluteTime *) &abs_time);
+ val = *(uint64_t *) &nanos;
+
+ tv->tv_sec = val / PA_NSEC_PER_SEC;
+ tv->tv_usec = (val % PA_NSEC_PER_SEC) / PA_NSEC_PER_USEC;
+
+ return tv;
+
+#elif defined(HAVE_CLOCK_GETTIME)
struct timespec ts;
#ifdef CLOCK_MONOTONIC
@@ -75,65 +88,39 @@ struct timeval *pa_rtclock_get(struct timeval *tv) {
tv->tv_usec = ts.tv_nsec / PA_NSEC_PER_USEC;
return tv;
-
-#elif defined(OS_IS_DARWIN)
- static mach_timebase_info_data_t tbi;
- uint64_t nticks;
- uint64_t time_nsec;
-
- /* Refer Apple ADC QA1398
- Also: http://devworld.apple.com/documentation/Darwin/Conceptual/KernelProgramming/services/services.html
-
- Note: argument is timespec NOT timeval (timespec uses nsec, timeval uses usec)
- */
-
- /* try and be a mite efficient - maybe I should keep the N/D as a float !? */
- if (tbi.denom == 0)
- mach_timebase_info(&tbi);
-
- nticks = mach_absolute_time();
- time_nsec = nticks * tbi.numer / tbi.denom; // see above
-
- tv->tv_sec = time_nsec / PA_NSEC_PER_SEC;
- tv->tv_usec = time_nsec / PA_NSEC_PER_USEC;
-
- return tv;
-
-#else /* OS_IS_DARWIN */
+#endif /* HAVE_CLOCK_GETTIME */
return pa_gettimeofday(tv);
-
-#endif
}
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;
-
- mach_timebase_info(&tbi);
+#endif /* HAVE_CLOCK_GETTIME */
- /* 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))