patch to use mach absolute time on mac OS X since apple advises against gettimeofday in IOProcs. Patch due to Ross Bencina.
This commit is contained in:
parent
998020553f
commit
31ed9cbe6e
1 changed files with 35 additions and 8 deletions
|
|
@ -51,6 +51,13 @@
|
|||
#include <math.h>
|
||||
#include <errno.h>
|
||||
|
||||
#if defined(__APPLE__) && !defined(HAVE_MACH_ABSOLUTE_TIME)
|
||||
#define HAVE_MACH_ABSOLUTE_TIME
|
||||
#endif
|
||||
#ifdef HAVE_MACH_ABSOLUTE_TIME
|
||||
#include <mach/mach_time.h>
|
||||
#endif
|
||||
|
||||
#include "pa_util.h"
|
||||
#include "pa_unix_util.h"
|
||||
#include "pa_debugprint.h"
|
||||
|
|
@ -118,27 +125,47 @@ void Pa_Sleep( long msec )
|
|||
#endif
|
||||
}
|
||||
|
||||
/* *** NOT USED YET: ***
|
||||
static int usePerformanceCounter_;
|
||||
static double microsecondsPerTick_;
|
||||
#ifdef HAVE_MACH_ABSOLUTE_TIME
|
||||
/*
|
||||
Discussion on the CoreAudio mailing list suggests that calling
|
||||
gettimeofday (or anything else in the BSD layer) is not real-time
|
||||
safe, so we use mach_absolute_time on OSX. This implementation is
|
||||
based on these two links:
|
||||
|
||||
Technical Q&A QA1398 - Mach Absolute Time Units
|
||||
http://developer.apple.com/mac/library/qa/qa2004/qa1398.html
|
||||
|
||||
Tutorial: Performance and Time.
|
||||
http://www.macresearch.org/tutorial_performance_and_time
|
||||
*/
|
||||
|
||||
/* Scaler to convert the result of mach_absolute_time to seconds */
|
||||
static double machSecondsConversionScaler_ = 0.0;
|
||||
#endif
|
||||
|
||||
void PaUtil_InitializeClock( void )
|
||||
{
|
||||
/* TODO */
|
||||
#ifdef HAVE_MACH_ABSOLUTE_TIME
|
||||
mach_timebase_info_data_t info;
|
||||
kern_return_t err = mach_timebase_info( &info );
|
||||
if( err == 0 )
|
||||
machSecondsConversionScaler_ = 1e-9 * (double) info.numer / (double) info.denom;
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
PaTime PaUtil_GetTime( void )
|
||||
{
|
||||
#ifdef HAVE_CLOCK_GETTIME
|
||||
#ifdef HAVE_MACH_ABSOLUTE_TIME
|
||||
return mach_absolute_time() * machSecondsConversionScaler_;
|
||||
#elif defined(HAVE_CLOCK_GETTIME)
|
||||
struct timespec tp;
|
||||
clock_gettime(CLOCK_REALTIME, &tp);
|
||||
return (PaTime)(tp.tv_sec + tp.tv_nsec / 1.e9);
|
||||
return (PaTime)(tp.tv_sec + tp.tv_nsec * 1e-9);
|
||||
#else
|
||||
struct timeval tv;
|
||||
gettimeofday( &tv, NULL );
|
||||
return (PaTime) tv.tv_usec / 1000000. + tv.tv_sec;
|
||||
return (PaTime) tv.tv_usec * 1e-6 + tv.tv_sec;
|
||||
#endif
|
||||
}
|
||||
|
||||
|
|
@ -190,7 +217,7 @@ PaError PaUtil_CancelThreading( PaUtilThreading *threading, int wait, PaError *e
|
|||
/* paUnixMainThread
|
||||
* We have to be a bit careful with defining this global variable,
|
||||
* as explained below. */
|
||||
#ifdef __apple__
|
||||
#ifdef __APPLE__
|
||||
/* apple/gcc has a "problem" with global vars and dynamic libs.
|
||||
Initializing it seems to fix the problem.
|
||||
Described a bit in this thread:
|
||||
|
|
|
|||
Loading…
Reference in a new issue