MKGetTimeBaseInfo.c [plain text]
#include <mach/kern_return.h>
#include <mach/mach_time.h>
#include <stdint.h>
extern void spin_lock(int *);
extern void spin_unlock(int *);
kern_return_t
MKGetTimeBaseInfo(
uint32_t *minAbsoluteTimeDelta,
uint32_t *theAbsoluteTimeToNanosecondNumerator,
uint32_t *theAbsoluteTimeToNanosecondDenominator,
uint32_t *theProcessorToAbsoluteTimeNumerator,
uint32_t *theProcessorToAbsoluteTimeDenominator
) {
static struct mach_timebase_info mti = {0};
static int MKGetTimeBaseInfo_spin_lock = 0;
if(mti.numer == 0) {
kern_return_t err;
spin_lock(&MKGetTimeBaseInfo_spin_lock);
err = mach_timebase_info(&mti);
spin_unlock(&MKGetTimeBaseInfo_spin_lock);
if(err != KERN_SUCCESS)
return err;
}
if(theAbsoluteTimeToNanosecondNumerator)
*theAbsoluteTimeToNanosecondNumerator = mti.numer;
if(theAbsoluteTimeToNanosecondDenominator)
*theAbsoluteTimeToNanosecondDenominator = mti.denom;
if(minAbsoluteTimeDelta)
*minAbsoluteTimeDelta = 1;
if(theProcessorToAbsoluteTimeNumerator)
*theProcessorToAbsoluteTimeNumerator = 1;
if(theProcessorToAbsoluteTimeDenominator)
*theProcessorToAbsoluteTimeDenominator = 1;
return KERN_SUCCESS;
}