| @@ -15,6 +15,11 @@ | |||||
| #include <sys/utsname.h> | #include <sys/utsname.h> | ||||
| #endif | #endif | ||||
| #if defined ARCH_MAC | |||||
| #include <mach/mach_init.h> | |||||
| #include <mach/thread_act.h> | |||||
| #endif | |||||
| #if defined ARCH_WIN | #if defined ARCH_WIN | ||||
| #include <windows.h> | #include <windows.h> | ||||
| #include <shellapi.h> | #include <shellapi.h> | ||||
| @@ -160,12 +165,20 @@ void setThreadRealTime(bool realTime) { | |||||
| double getThreadTime() { | double getThreadTime() { | ||||
| #if defined ARCH_LIN || defined ARCH_MAC | |||||
| #if defined ARCH_LIN | |||||
| struct timespec ts; | struct timespec ts; | ||||
| clockid_t cid; | clockid_t cid; | ||||
| pthread_getcpuclockid(pthread_self(), &cid); | pthread_getcpuclockid(pthread_self(), &cid); | ||||
| clock_gettime(cid, &ts); | clock_gettime(cid, &ts); | ||||
| return ts.tv_sec + ts.tv_nsec * 1e-9; | return ts.tv_sec + ts.tv_nsec * 1e-9; | ||||
| #elif defined ARCH_MAC | |||||
| mach_port_t thread = mach_thread_self(); | |||||
| mach_msg_type_number_t count = THREAD_BASIC_INFO_COUNT; | |||||
| thread_basic_info_data_t info; | |||||
| kern_return_t kr = thread_info(thread, THREAD_BASIC_INFO, (thread_info_t) &info, &count); | |||||
| if (kr != KERN_SUCCESS || (info.flags & TH_FLAGS_IDLE) != 0) | |||||
| return 0.0; | |||||
| return info.user_time.seconds + info.user_time.microseconds * 1e-6; | |||||
| #elif defined ARCH_WIN | #elif defined ARCH_WIN | ||||
| FILETIME creationTime; | FILETIME creationTime; | ||||
| FILETIME exitTime; | FILETIME exitTime; | ||||