[pulseaudio-discuss] [PATCH 4/4] Wrap clock_gettime and friends

Daniel Mack daniel at caiaq.de
Mon Oct 26 00:48:17 PDT 2009


ping?

On Mon, Oct 19, 2009 at 12:45:30PM +0200, Daniel Mack wrote:
> On Wed, Sep 16, 2009 at 11:48:58PM +0200, Lennart Poettering wrote:
> > On Wed, 16.09.09 15:15, Daniel Mack (daniel at caiaq.de) wrote:
> > 
> > > From: Kim Lester <kim at dfusion.com.au>
> > > 
> > > OS X does not define clockid_t or clock_gettime() and friends.
> > > Add a wrapper to fix this.
> > 
> > Hmpf. I am not particularly happy with this. This adds a lot of
> > unnecessary compat code. We don't actually need implementations of
> > clock_getres(). All we need is some kind of check whether system
> > timers are accurate or whether they are rounded up to scheduling
> > slices. On Linux we do that check with clock_getres(), but all the
> > information it returns is actually not intertesting at all. We just
> > check if this is below some trheshold, that's all.
> > 
> > clock_settime() we don't use at all! We shouldn't carry compat code
> > for that.
> > 
> > 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.
> 
> Daniel
> 
> From 9f0a051953ec354ccdb8aa44a9845c408b26ae0b Mon Sep 17 00:00:00 2001
> From: Kim Lester <kim at dfusion.com.au>
> Date: Wed, 16 Sep 2009 14:40:01 +0800
> Subject: [PATCH] Implement pa_rtclock_get() and pa_rtclock_hrtimer() for Darwin
> 
> OS X does not define clockid_t or clock_gettime() and friends.
> Add wrappers to fix this. Based on a patch from Kim Lester
> <kim at dfusion.com.au>.
> 
> Signed-off-by: Daniel Mack <daniel at caiaq.de>
> ---
>  src/pulsecore/core-rtclock.c |   53 ++++++++++++++++++++++++++++++++++++++---
>  1 files changed, 49 insertions(+), 4 deletions(-)
> 
> diff --git a/src/pulsecore/core-rtclock.c b/src/pulsecore/core-rtclock.c
> index 1420470..15b4f16 100644
> --- a/src/pulsecore/core-rtclock.c
> +++ b/src/pulsecore/core-rtclock.c
> @@ -33,6 +33,12 @@
>  #include <sys/prctl.h>
>  #endif
>  
> +#ifdef OS_IS_DARWIN
> +#include <CoreServices/CoreServices.h>
> +#include <mach/mach.h>
> +#include <mach/mach_time.h>
> +#endif
> +
>  #include <pulse/timeval.h>
>  #include <pulsecore/macro.h>
>  #include <pulsecore/core-error.h>
> @@ -47,6 +53,7 @@ pa_usec_t pa_rtclock_age(const struct timeval *tv) {
>  }
>  
>  struct timeval *pa_rtclock_get(struct timeval *tv) {
> +#ifndef OS_IS_DARWIN
>  #ifdef HAVE_CLOCK_GETTIME
>      struct timespec ts;
>  
> @@ -59,7 +66,7 @@ struct timeval *pa_rtclock_get(struct timeval *tv) {
>              no_monotonic = TRUE;
>  
>      if (no_monotonic)
> -#endif
> +#endif /* CLOCK_MONOTONIC */
>          pa_assert_se(clock_gettime(CLOCK_REALTIME, &ts) == 0);
>  
>      pa_assert(tv);
> @@ -73,21 +80,59 @@ struct timeval *pa_rtclock_get(struct timeval *tv) {
>  
>      return pa_gettimeofday(tv);
>  
> -#endif
> +#endif /* HAVE_CLOCK_GETTIME */
> +
> +#else /* 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;
> +
> +#endif /* OS_IS_DARWIN */
>  }
>  
>  pa_bool_t pa_rtclock_hrtimer(void) {
>  #ifdef HAVE_CLOCK_GETTIME
> -    struct timespec ts;
>  
>  #ifdef CLOCK_MONOTONIC
> +    struct timespec ts;
> +
>      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
> +#elif 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);
> +#else
> +    struct timespec ts;
>  
>      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);
>  
> +#endif /* OS_IS_DARWIN */
> +
>  #else /* HAVE_CLOCK_GETTIME */
>  
>      return FALSE;
> -- 
> 1.6.3.3
> 
> _______________________________________________
> pulseaudio-discuss mailing list
> pulseaudio-discuss at mail.0pointer.de
> https://tango.0pointer.de/mailman/listinfo/pulseaudio-discuss



More information about the pulseaudio-discuss mailing list