diff options
author | Kae <80987908+Novaenia@users.noreply.github.com> | 2023-06-20 14:33:09 +1000 |
---|---|---|
committer | Kae <80987908+Novaenia@users.noreply.github.com> | 2023-06-20 14:33:09 +1000 |
commit | 6352e8e3196f78388b6c771073f9e03eaa612673 (patch) | |
tree | e23772f79a7fbc41bc9108951e9e136857484bf4 /source/core/StarTime_unix.cpp | |
parent | 6741a057e5639280d85d0f88ba26f000baa58f61 (diff) |
everything everywhere
all at once
Diffstat (limited to 'source/core/StarTime_unix.cpp')
-rw-r--r-- | source/core/StarTime_unix.cpp | 96 |
1 files changed, 96 insertions, 0 deletions
diff --git a/source/core/StarTime_unix.cpp b/source/core/StarTime_unix.cpp new file mode 100644 index 0000000..50ed954 --- /dev/null +++ b/source/core/StarTime_unix.cpp @@ -0,0 +1,96 @@ +#include "StarTime.hpp" +#include "StarMathCommon.hpp" + +#include <sys/time.h> + +#ifdef STAR_SYSTEM_MACOS +#include <mach/mach_time.h> +#else +#include <time.h> +#endif + +namespace Star { + +String Time::printDateAndTime(int64_t epochTicks, String format) { + // playing fast and loose with the standard here... + time_t requestedTime = epochTicks / epochTickFrequency(); + struct tm ptm; + localtime_r(&requestedTime, &ptm); + + return format.replaceTags(StringMap<String>{ + {"year", strf("%04d", ptm.tm_year + 1900)}, + {"month", strf("%02d", ptm.tm_mon + 1)}, + {"day", strf("%02d", ptm.tm_mday)}, + {"hours", strf("%02d", ptm.tm_hour)}, + {"minutes", strf("%02d", ptm.tm_min)}, + {"seconds", strf("%02d", ptm.tm_sec)}, + {"millis", strf("%03d", (epochTicks % epochTickFrequency()) / (epochTickFrequency() / 1000))} + }); +} + +int64_t Time::epochTicks() { + timeval tv; + gettimeofday(&tv, NULL); + return (int64_t)tv.tv_sec * 1'000'000 + tv.tv_usec; +} + +int64_t Time::epochTickFrequency() { + return 1'000'000; +} + +#ifdef STAR_SYSTEM_MACOS + +struct MonotonicClock { + MonotonicClock() { + mach_timebase_info(&timebaseInfo); + }; + + int64_t ticks() const { + int64_t t = mach_absolute_time(); + return (t / 100) * timebaseInfo.numer / timebaseInfo.denom; + } + + int64_t frequency() const { + // hard coded to 100ns increments + return 10'000'000; + } + + mach_timebase_info_data_t timebaseInfo; +}; + +#else + +struct MonotonicClock { + MonotonicClock() { + timespec ts; + clock_getres(CLOCK_MONOTONIC, &ts); + starAssert(ts.tv_sec == 0); + storedFrequency = 1'000'000'000 / ts.tv_nsec; + }; + + int64_t ticks() const { + timespec ts; + clock_gettime(CLOCK_MONOTONIC, &ts); + return ts.tv_sec * storedFrequency + ts.tv_nsec * storedFrequency / 1'000'000'000; + } + + int64_t frequency() const { + return storedFrequency; + } + + int64_t storedFrequency; +}; + +#endif + +static MonotonicClock g_monotonicClock; + +int64_t Time::monotonicTicks() { + return g_monotonicClock.ticks(); +} + +int64_t Time::monotonicTickFrequency() { + return g_monotonicClock.frequency(); +} + +} |