diff --git a/source/mijin/util/os.cpp b/source/mijin/util/os.cpp index 54add49..6f82bae 100644 --- a/source/mijin/util/os.cpp +++ b/source/mijin/util/os.cpp @@ -39,9 +39,9 @@ namespace mijin // internal variables // -#if MIJIN_TARGET_OS == MIJIN_OS_LINUX namespace { +#if MIJIN_TARGET_OS == MIJIN_OS_LINUX std::mutex gDlErrorMutex; // dlerror may not be thread-safe const std::uint64_t gCPUClockResolution = []() @@ -52,8 +52,16 @@ const std::uint64_t gCPUClockResolution = []() MIJIN_ASSERT(time.tv_sec == 0, "What kind of cpu clock is this?"); return static_cast(time.tv_nsec); }(); -}; -#endif // MIJIN_TARGET_OS == MIJIN_OS_LINUX +#elif MIJIN_TARGET_OS == MIJIN_OS_WINDOWS +const std::uint64_t gCPUTickFrequency = []() +{ + LARGE_INTEGER ticks; + [[maybe_unused]] const BOOL result = QueryPerformanceFrequency(&ticks); + MIJIN_ASSERT(result, "Error getting cpu frequency."); + return static_cast(ticks.QuadPart); +}(); +#endif // MIJIN_TARGET_OS == MIJIN_OS_LINUX || MIJIN_TARGET_OS == MIJIN_OS_WINDOWS +} // // internal functions @@ -196,8 +204,10 @@ std::uint64_t getCPUTicks() MIJIN_NOEXCEPT MIJIN_ASSERT(result == 0, "Error getting cpu time."); return (static_cast(time.tv_sec) * 1e9 + time.tv_nsec) / gCPUClockResolution; #else - MIJIN_ERROR("TODO"); - return 0; + LARGE_INTEGER ticks; + [[maybe_unused]] const BOOL result = QueryPerformanceCounter(&ticks); + MIJIN_ASSERT(result, "Error getting cpu time."); + return static_cast(ticks.QuadPart); #endif } @@ -206,8 +216,7 @@ std::uint64_t getCPUTicksPerSecond() MIJIN_NOEXCEPT #if MIJIN_TARGET_OS == MIJIN_OS_LINUX return 1e9 / gCPUClockResolution; #else - MIJIN_ERROR("TODO"); - return 0; + return gCPUTickFrequency; #endif } } // namespace mijin