From d0283265ccaad2802e08f81992b906f873239d8e Mon Sep 17 00:00:00 2001 From: Danila Malyutin Date: Wed, 19 Aug 2015 00:27:41 +0300 Subject: [PATCH] Improve clock_gettime on osx and some clean up --- Utilities/GNU.cpp | 52 +++++++++++++++++++++++++++++++++++++------- Utilities/GNU.h | 19 +++++++++++----- rpcs3/CMakeLists.txt | 6 ++--- 3 files changed, 60 insertions(+), 17 deletions(-) diff --git a/Utilities/GNU.cpp b/Utilities/GNU.cpp index 9f21a344ba..70daa61441 100644 --- a/Utilities/GNU.cpp +++ b/Utilities/GNU.cpp @@ -1,16 +1,52 @@ #include "GNU.h" #ifdef __APPLE__ -#include -#include +#include +#include +#include +#include +#include +#undef CPU_STATE_MAX -int clock_gettime(int foo, struct timespec *ts) { - struct timeval tv; +#define MT_NANO (+1.0E-9) +#define MT_GIGA UINT64_C(1000000000) - gettimeofday(&tv, NULL); - ts->tv_sec = tv.tv_sec; - ts->tv_nsec = tv.tv_usec * 1000; - return(0); +// TODO create a list of timers, +static double mt_timebase = 0.0; +static uint64_t mt_timestart = 0; + +// TODO be more careful in a multithreaded environement +int clock_gettime(clockid_t clk_id, struct timespec *tp) +{ + kern_return_t retval = KERN_SUCCESS; + if( clk_id == TIMER_ABSTIME) + { + if (!mt_timestart) { // only one timer, initilized on the first call to the TIMER + mach_timebase_info_data_t tb = { 0 }; + mach_timebase_info(&tb); + mt_timebase = tb.numer; + mt_timebase /= tb.denom; + mt_timestart = mach_absolute_time(); + } + + double diff = (mach_absolute_time() - mt_timestart) * mt_timebase; + tp->tv_sec = diff * MT_NANO; + tp->tv_nsec = diff - (tp->tv_sec * MT_GIGA); + } + else // other clk_ids are mapped to the coresponding mach clock_service + { + clock_serv_t cclock; + mach_timespec_t mts; + + host_get_clock_service(mach_host_self(), clk_id, &cclock); + retval = clock_get_time(cclock, &mts); + mach_port_deallocate(mach_task_self(), cclock); + + tp->tv_sec = mts.tv_sec; + tp->tv_nsec = mts.tv_nsec; + } + + return retval; } #endif /* __APPLE__ */ #if defined(__GNUG__) diff --git a/Utilities/GNU.h b/Utilities/GNU.h index 5caba7d525..a36085a745 100644 --- a/Utilities/GNU.h +++ b/Utilities/GNU.h @@ -68,12 +68,21 @@ inline int64_t __mulh(int64_t a, int64_t b) #ifdef __APPLE__ -int clock_gettime(int foo, struct timespec *ts); -#define wxIsNaN(x) ((x) != (x)) +// XXX only supports a single timer +#define TIMER_ABSTIME -1 +/* The opengroup spec isn't clear on the mapping from REALTIME to CALENDAR + being appropriate or not. + http://pubs.opengroup.org/onlinepubs/009695299/basedefs/time.h.html */ +#define CLOCK_REALTIME 1 // #define CALENDAR_CLOCK 1 from mach/clock_types.h +#define CLOCK_MONOTONIC 0 // #define SYSTEM_CLOCK 0 -#ifndef CLOCK_MONOTONIC -#define CLOCK_MONOTONIC 0 -#endif /* !CLOCK_MONOTONIC */ +typedef int clockid_t; + +/* the mach kernel uses struct mach_timespec, so struct timespec + is loaded from for compatability */ +// struct timespec { time_t tv_sec; long tv_nsec; }; + +int clock_gettime(clockid_t clk_id, struct timespec *tp); #endif /* __APPLE__ */ diff --git a/rpcs3/CMakeLists.txt b/rpcs3/CMakeLists.txt index 4b2ffbfcf3..7d7677ff3d 100644 --- a/rpcs3/CMakeLists.txt +++ b/rpcs3/CMakeLists.txt @@ -1,7 +1,6 @@ cmake_minimum_required(VERSION 2.8.12) set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/cmake_modules") -set(CMAKE_VERBOSE_MAKEFILE ON) include(cotire) project(rpcs3) @@ -21,7 +20,7 @@ if(CMAKE_COMPILER_IS_GNUCXX) add_compile_options(-Wno-attributes -Wno-enum-compare -Wno-invalid-offsetof) elseif("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang") if(APPLE) - add_compile_options(-stdlib=libc++) # TODO: stdlib? + add_compile_options(-stdlib=libc++) endif() endif() @@ -47,7 +46,7 @@ if(${CMAKE_SYSTEM_NAME} MATCHES "Linux") elseif(UNIX) #it seems like glibc includes the iconv functions we use but other libc #implementations like the one on OSX don't seem implement them - set(ADDITIONAL_LIBS "iconv") + set(ADDITIONAL_LIBS "iconv" "z") else() set(ADDITIONAL_LIBS "") endif() @@ -81,7 +80,6 @@ if(NOT WIN32) ) endif() find_package(GLEW REQUIRED) - message("${GLEW_LIBRARY} AND ${GLEW_INCLUDE_DIR}") endif() find_package(OpenGL REQUIRED) find_package(OpenAL REQUIRED)