Веб-сайт самохостера Lotigara

summaryrefslogtreecommitdiff
path: root/source/core/StarTime_unix.cpp
diff options
context:
space:
mode:
authorKae <80987908+Novaenia@users.noreply.github.com>2023-06-20 14:33:09 +1000
committerKae <80987908+Novaenia@users.noreply.github.com>2023-06-20 14:33:09 +1000
commit6352e8e3196f78388b6c771073f9e03eaa612673 (patch)
treee23772f79a7fbc41bc9108951e9e136857484bf4 /source/core/StarTime_unix.cpp
parent6741a057e5639280d85d0f88ba26f000baa58f61 (diff)
everything everywhere
all at once
Diffstat (limited to 'source/core/StarTime_unix.cpp')
-rw-r--r--source/core/StarTime_unix.cpp96
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();
+}
+
+}