2007-10-28 19:13:50 +00:00
|
|
|
/***
|
|
|
|
|
This file is part of PulseAudio.
|
|
|
|
|
|
|
|
|
|
Copyright 2004-2006 Lennart Poettering
|
|
|
|
|
Copyright 2006 Pierre Ossman <ossman@cendio.se> for Cendio AB
|
|
|
|
|
|
|
|
|
|
PulseAudio is free software; you can redistribute it and/or modify
|
|
|
|
|
it under the terms of the GNU Lesser General Public License as
|
|
|
|
|
published by the Free Software Foundation; either version 2.1 of the
|
|
|
|
|
License, or (at your option) any later version.
|
|
|
|
|
|
|
|
|
|
PulseAudio is distributed in the hope that it will be useful, but
|
|
|
|
|
WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
|
|
|
Lesser General Public License for more details.
|
|
|
|
|
|
|
|
|
|
You should have received a copy of the GNU Lesser General Public
|
|
|
|
|
License along with PulseAudio; if not, write to the Free Software
|
|
|
|
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
|
|
|
|
|
USA.
|
|
|
|
|
***/
|
|
|
|
|
|
|
|
|
|
#ifdef HAVE_CONFIG_H
|
|
|
|
|
#include <config.h>
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#include <stddef.h>
|
|
|
|
|
#include <time.h>
|
|
|
|
|
#include <sys/time.h>
|
2009-01-16 19:57:58 +01:00
|
|
|
#include <errno.h>
|
2007-10-28 19:13:50 +00:00
|
|
|
|
2009-02-26 16:48:58 +11:00
|
|
|
#ifdef HAVE_SYS_PRCTL_H
|
|
|
|
|
#include <sys/prctl.h>
|
|
|
|
|
#endif
|
|
|
|
|
|
Wrap clock_gettime and friends
On Wed, Sep 16, 2009 at 11:48:58PM +0200, Lennart Poettering wrote:
> On Wed, 16.09.09 15:15, Daniel Mack (daniel@caiaq.de) wrote:
>
> > From: Kim Lester <kim@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
Daniel
>From 9f0a051953ec354ccdb8aa44a9845c408b26ae0b Mon Sep 17 00:00:00 2001
From: Kim Lester <kim@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@dfusion.com.au>.
2009-10-19 12:45:30 +02:00
|
|
|
#ifdef OS_IS_DARWIN
|
|
|
|
|
#include <CoreServices/CoreServices.h>
|
|
|
|
|
#include <mach/mach.h>
|
|
|
|
|
#include <mach/mach_time.h>
|
2009-11-01 20:06:08 +01:00
|
|
|
#include <unistd.h>
|
Wrap clock_gettime and friends
On Wed, Sep 16, 2009 at 11:48:58PM +0200, Lennart Poettering wrote:
> On Wed, 16.09.09 15:15, Daniel Mack (daniel@caiaq.de) wrote:
>
> > From: Kim Lester <kim@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
Daniel
>From 9f0a051953ec354ccdb8aa44a9845c408b26ae0b Mon Sep 17 00:00:00 2001
From: Kim Lester <kim@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@dfusion.com.au>.
2009-10-19 12:45:30 +02:00
|
|
|
#endif
|
|
|
|
|
|
2011-01-18 11:26:57 +01:00
|
|
|
#ifdef HAVE_WINDOWS_H
|
|
|
|
|
#include <windows.h>
|
|
|
|
|
#endif
|
|
|
|
|
|
2007-10-28 19:13:50 +00:00
|
|
|
#include <pulse/timeval.h>
|
|
|
|
|
#include <pulsecore/macro.h>
|
2009-01-16 19:57:58 +01:00
|
|
|
#include <pulsecore/core-error.h>
|
2007-10-28 19:13:50 +00:00
|
|
|
|
2009-04-04 23:19:53 +03:00
|
|
|
#include "core-rtclock.h"
|
2007-10-28 19:13:50 +00:00
|
|
|
|
2011-01-18 11:26:57 +01:00
|
|
|
#ifdef OS_IS_WIN32
|
|
|
|
|
static int64_t counter_freq = 0;
|
|
|
|
|
#endif
|
|
|
|
|
|
2007-10-28 19:13:50 +00:00
|
|
|
pa_usec_t pa_rtclock_age(const struct timeval *tv) {
|
|
|
|
|
struct timeval now;
|
|
|
|
|
pa_assert(tv);
|
|
|
|
|
|
|
|
|
|
return pa_timeval_diff(pa_rtclock_get(&now), tv);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
struct timeval *pa_rtclock_get(struct timeval *tv) {
|
Wrap clock_gettime and friends
On Wed, Sep 16, 2009 at 11:48:58PM +0200, Lennart Poettering wrote:
> On Wed, 16.09.09 15:15, Daniel Mack (daniel@caiaq.de) wrote:
>
> > From: Kim Lester <kim@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
Daniel
>From 9f0a051953ec354ccdb8aa44a9845c408b26ae0b Mon Sep 17 00:00:00 2001
From: Kim Lester <kim@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@dfusion.com.au>.
2009-10-19 12:45:30 +02:00
|
|
|
|
2009-11-01 20:06:08 +01:00
|
|
|
#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)
|
2007-10-28 19:13:50 +00:00
|
|
|
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)
|
Wrap clock_gettime and friends
On Wed, Sep 16, 2009 at 11:48:58PM +0200, Lennart Poettering wrote:
> On Wed, 16.09.09 15:15, Daniel Mack (daniel@caiaq.de) wrote:
>
> > From: Kim Lester <kim@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
Daniel
>From 9f0a051953ec354ccdb8aa44a9845c408b26ae0b Mon Sep 17 00:00:00 2001
From: Kim Lester <kim@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@dfusion.com.au>.
2009-10-19 12:45:30 +02:00
|
|
|
#endif /* CLOCK_MONOTONIC */
|
2007-10-28 19:13:50 +00:00
|
|
|
pa_assert_se(clock_gettime(CLOCK_REALTIME, &ts) == 0);
|
|
|
|
|
|
|
|
|
|
pa_assert(tv);
|
|
|
|
|
|
|
|
|
|
tv->tv_sec = ts.tv_sec;
|
2009-06-23 03:55:32 +02:00
|
|
|
tv->tv_usec = ts.tv_nsec / PA_NSEC_PER_USEC;
|
2007-10-28 19:13:50 +00:00
|
|
|
|
|
|
|
|
return tv;
|
2011-01-18 11:26:57 +01:00
|
|
|
#elif defined(OS_IS_WIN32)
|
|
|
|
|
if (counter_freq > 0) {
|
|
|
|
|
LARGE_INTEGER count;
|
|
|
|
|
|
|
|
|
|
pa_assert_se(QueryPerformanceCounter(&count));
|
|
|
|
|
|
|
|
|
|
tv->tv_sec = count.QuadPart / counter_freq;
|
|
|
|
|
tv->tv_usec = (count.QuadPart % counter_freq) * PA_USEC_PER_SEC / counter_freq;
|
|
|
|
|
|
|
|
|
|
return tv;
|
|
|
|
|
}
|
2009-11-01 20:06:08 +01:00
|
|
|
#endif /* HAVE_CLOCK_GETTIME */
|
2007-10-28 19:13:50 +00:00
|
|
|
|
|
|
|
|
return pa_gettimeofday(tv);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
pa_bool_t pa_rtclock_hrtimer(void) {
|
Wrap clock_gettime and friends
On Wed, Sep 16, 2009 at 11:48:58PM +0200, Lennart Poettering wrote:
> On Wed, 16.09.09 15:15, Daniel Mack (daniel@caiaq.de) wrote:
>
> > From: Kim Lester <kim@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
Daniel
>From 9f0a051953ec354ccdb8aa44a9845c408b26ae0b Mon Sep 17 00:00:00 2001
From: Kim Lester <kim@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@dfusion.com.au>.
2009-10-19 12:45:30 +02:00
|
|
|
|
2009-11-01 20:06:08 +01:00
|
|
|
#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)
|
2007-10-28 19:13:50 +00:00
|
|
|
struct timespec ts;
|
|
|
|
|
|
|
|
|
|
#ifdef CLOCK_MONOTONIC
|
Wrap clock_gettime and friends
On Wed, Sep 16, 2009 at 11:48:58PM +0200, Lennart Poettering wrote:
> On Wed, 16.09.09 15:15, Daniel Mack (daniel@caiaq.de) wrote:
>
> > From: Kim Lester <kim@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
Daniel
>From 9f0a051953ec354ccdb8aa44a9845c408b26ae0b Mon Sep 17 00:00:00 2001
From: Kim Lester <kim@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@dfusion.com.au>.
2009-10-19 12:45:30 +02:00
|
|
|
|
2007-10-28 19:13:50 +00:00
|
|
|
if (clock_getres(CLOCK_MONOTONIC, &ts) >= 0)
|
2009-06-23 03:55:32 +02:00
|
|
|
return ts.tv_sec == 0 && ts.tv_nsec <= (long) (PA_HRTIMER_THRESHOLD_USEC*PA_NSEC_PER_USEC);
|
2009-11-01 20:06:08 +01:00
|
|
|
|
Wrap clock_gettime and friends
On Wed, Sep 16, 2009 at 11:48:58PM +0200, Lennart Poettering wrote:
> On Wed, 16.09.09 15:15, Daniel Mack (daniel@caiaq.de) wrote:
>
> > From: Kim Lester <kim@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
Daniel
>From 9f0a051953ec354ccdb8aa44a9845c408b26ae0b Mon Sep 17 00:00:00 2001
From: Kim Lester <kim@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@dfusion.com.au>.
2009-10-19 12:45:30 +02:00
|
|
|
#endif /* CLOCK_MONOTONIC */
|
2007-10-28 19:13:50 +00:00
|
|
|
|
|
|
|
|
pa_assert_se(clock_getres(CLOCK_REALTIME, &ts) == 0);
|
2009-06-23 03:55:32 +02:00
|
|
|
return ts.tv_sec == 0 && ts.tv_nsec <= (long) (PA_HRTIMER_THRESHOLD_USEC*PA_NSEC_PER_USEC);
|
2007-10-28 19:13:50 +00:00
|
|
|
|
2011-01-18 11:26:57 +01:00
|
|
|
#elif defined(OS_IS_WIN32)
|
|
|
|
|
|
|
|
|
|
if (counter_freq > 0)
|
|
|
|
|
return counter_freq >= (int64_t) (PA_USEC_PER_SEC/PA_HRTIMER_THRESHOLD_USEC);
|
|
|
|
|
|
2009-11-01 20:06:08 +01:00
|
|
|
#endif /* HAVE_CLOCK_GETTIME */
|
2007-10-28 19:13:50 +00:00
|
|
|
|
|
|
|
|
return FALSE;
|
|
|
|
|
}
|
|
|
|
|
|
2009-03-24 20:59:54 +01:00
|
|
|
#define TIMER_SLACK_NS (int) ((500 * PA_NSEC_PER_USEC))
|
|
|
|
|
|
2009-01-16 19:57:58 +01:00
|
|
|
void pa_rtclock_hrtimer_enable(void) {
|
Wrap clock_gettime and friends
On Wed, Sep 16, 2009 at 11:48:58PM +0200, Lennart Poettering wrote:
> On Wed, 16.09.09 15:15, Daniel Mack (daniel@caiaq.de) wrote:
>
> > From: Kim Lester <kim@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
Daniel
>From 9f0a051953ec354ccdb8aa44a9845c408b26ae0b Mon Sep 17 00:00:00 2001
From: Kim Lester <kim@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@dfusion.com.au>.
2009-10-19 12:45:30 +02:00
|
|
|
|
2009-01-16 19:57:58 +01:00
|
|
|
#ifdef PR_SET_TIMERSLACK
|
|
|
|
|
int slack_ns;
|
|
|
|
|
|
|
|
|
|
if ((slack_ns = prctl(PR_GET_TIMERSLACK, 0, 0, 0, 0)) < 0) {
|
|
|
|
|
pa_log_info("PR_GET_TIMERSLACK/PR_SET_TIMERSLACK not supported.");
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
2009-03-24 20:59:54 +01:00
|
|
|
pa_log_debug("Timer slack is set to %i us.", (int) (slack_ns/PA_NSEC_PER_USEC));
|
2009-01-16 19:57:58 +01:00
|
|
|
|
2009-03-24 20:59:54 +01:00
|
|
|
if (slack_ns > TIMER_SLACK_NS) {
|
|
|
|
|
slack_ns = TIMER_SLACK_NS;
|
2009-01-16 19:57:58 +01:00
|
|
|
|
2009-03-24 20:59:54 +01:00
|
|
|
pa_log_debug("Setting timer slack to %i us.", (int) (slack_ns/PA_NSEC_PER_USEC));
|
2009-01-16 19:57:58 +01:00
|
|
|
|
2009-03-24 20:59:54 +01:00
|
|
|
if (prctl(PR_SET_TIMERSLACK, slack_ns, 0, 0, 0) < 0) {
|
|
|
|
|
pa_log_warn("PR_SET_TIMERSLACK failed: %s", pa_cstrerror(errno));
|
|
|
|
|
return;
|
|
|
|
|
}
|
2009-01-16 19:57:58 +01:00
|
|
|
}
|
|
|
|
|
|
2011-01-18 11:26:57 +01:00
|
|
|
#elif defined(OS_IS_WIN32)
|
|
|
|
|
LARGE_INTEGER freq;
|
|
|
|
|
|
|
|
|
|
pa_assert_se(QueryPerformanceFrequency(&freq));
|
|
|
|
|
counter_freq = freq.QuadPart;
|
|
|
|
|
|
2009-01-16 19:57:58 +01:00
|
|
|
#endif
|
|
|
|
|
}
|
|
|
|
|
|
2008-05-15 23:34:41 +00:00
|
|
|
struct timeval* pa_rtclock_from_wallclock(struct timeval *tv) {
|
|
|
|
|
struct timeval wc_now, rt_now;
|
|
|
|
|
|
2011-03-15 21:06:46 +01:00
|
|
|
pa_assert(tv);
|
|
|
|
|
|
2008-05-15 23:34:41 +00:00
|
|
|
pa_gettimeofday(&wc_now);
|
|
|
|
|
pa_rtclock_get(&rt_now);
|
|
|
|
|
|
2009-09-18 04:11:59 +02:00
|
|
|
/* pa_timeval_sub() saturates on underflow! */
|
|
|
|
|
|
2008-05-15 23:34:41 +00:00
|
|
|
if (pa_timeval_cmp(&wc_now, tv) < 0)
|
|
|
|
|
pa_timeval_add(&rt_now, pa_timeval_diff(tv, &wc_now));
|
|
|
|
|
else
|
|
|
|
|
pa_timeval_sub(&rt_now, pa_timeval_diff(&wc_now, tv));
|
|
|
|
|
|
|
|
|
|
*tv = rt_now;
|
|
|
|
|
|
|
|
|
|
return tv;
|
|
|
|
|
}
|
2009-02-19 04:00:29 +01:00
|
|
|
|
2011-01-06 00:51:33 +01:00
|
|
|
#ifdef HAVE_CLOCK_GETTIME
|
2009-02-19 04:00:29 +01:00
|
|
|
pa_usec_t pa_timespec_load(const struct timespec *ts) {
|
2009-09-18 04:11:59 +02:00
|
|
|
|
|
|
|
|
if (PA_UNLIKELY(!ts))
|
|
|
|
|
return PA_USEC_INVALID;
|
2009-02-19 04:00:29 +01:00
|
|
|
|
|
|
|
|
return
|
|
|
|
|
(pa_usec_t) ts->tv_sec * PA_USEC_PER_SEC +
|
|
|
|
|
(pa_usec_t) ts->tv_nsec / PA_NSEC_PER_USEC;
|
|
|
|
|
}
|
2009-04-05 02:13:43 +03:00
|
|
|
|
2009-09-18 04:08:36 +02:00
|
|
|
struct timespec* pa_timespec_store(struct timespec *ts, pa_usec_t v) {
|
|
|
|
|
pa_assert(ts);
|
|
|
|
|
|
|
|
|
|
if (PA_UNLIKELY(v == PA_USEC_INVALID)) {
|
|
|
|
|
ts->tv_sec = PA_INT_TYPE_MAX(time_t);
|
|
|
|
|
ts->tv_nsec = (long) (PA_NSEC_PER_SEC-1);
|
|
|
|
|
return NULL;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ts->tv_sec = (time_t) (v / PA_USEC_PER_SEC);
|
|
|
|
|
ts->tv_nsec = (long) ((v % PA_USEC_PER_SEC) * PA_NSEC_PER_USEC);
|
|
|
|
|
|
|
|
|
|
return ts;
|
|
|
|
|
}
|
2011-01-06 00:51:33 +01:00
|
|
|
#endif
|
2009-04-05 02:13:43 +03:00
|
|
|
|
|
|
|
|
static struct timeval* wallclock_from_rtclock(struct timeval *tv) {
|
|
|
|
|
struct timeval wc_now, rt_now;
|
|
|
|
|
|
2011-03-15 21:06:46 +01:00
|
|
|
pa_assert(tv);
|
|
|
|
|
|
2009-04-05 02:13:43 +03:00
|
|
|
pa_gettimeofday(&wc_now);
|
|
|
|
|
pa_rtclock_get(&rt_now);
|
|
|
|
|
|
2009-09-18 04:11:59 +02:00
|
|
|
/* pa_timeval_sub() saturates on underflow! */
|
|
|
|
|
|
2009-04-05 02:13:43 +03:00
|
|
|
if (pa_timeval_cmp(&rt_now, tv) < 0)
|
|
|
|
|
pa_timeval_add(&wc_now, pa_timeval_diff(tv, &rt_now));
|
|
|
|
|
else
|
|
|
|
|
pa_timeval_sub(&wc_now, pa_timeval_diff(&rt_now, tv));
|
|
|
|
|
|
|
|
|
|
*tv = wc_now;
|
|
|
|
|
|
|
|
|
|
return tv;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
struct timeval* pa_timeval_rtstore(struct timeval *tv, pa_usec_t v, pa_bool_t rtclock) {
|
|
|
|
|
pa_assert(tv);
|
|
|
|
|
|
2009-06-20 16:52:41 +03:00
|
|
|
if (v == PA_USEC_INVALID)
|
|
|
|
|
return NULL;
|
|
|
|
|
|
2009-04-05 02:13:43 +03:00
|
|
|
pa_timeval_store(tv, v);
|
|
|
|
|
|
|
|
|
|
if (rtclock)
|
|
|
|
|
tv->tv_usec |= PA_TIMEVAL_RTCLOCK;
|
|
|
|
|
else
|
|
|
|
|
wallclock_from_rtclock(tv);
|
|
|
|
|
|
|
|
|
|
return tv;
|
|
|
|
|
}
|