]> git.lizzy.rs Git - dragonfireclient.git/blobdiff - src/gettime.h
Patch built-in Lua to fix miscompile on Android (#12347)
[dragonfireclient.git] / src / gettime.h
index bae8b97c016cd414b0ec9b41649b654515a657bc..772ff9b50c536ecb01c9b81f744b6420596a3883 100644 (file)
@@ -19,9 +19,9 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 
 #pragma once
 
-#include "irrlichttypes.h"
-#include <time.h>
+#include <ctime>
 #include <string>
+#include <mutex>
 
 enum TimePrecision
 {
@@ -31,13 +31,34 @@ enum TimePrecision
        PRECISION_NANO
 };
 
-inline std::string getTimestamp()
+inline struct tm mt_localtime()
 {
+       // initialize the time zone on first invocation
+       static std::once_flag tz_init;
+       std::call_once(tz_init, [] {
+#ifdef _WIN32
+               _tzset();
+#else
+               tzset();
+#endif
+               });
+
+       struct tm ret;
        time_t t = time(NULL);
-       // This is not really thread-safe but it won't break anything
-       // except its own output, so just go with it.
-       struct tm *tm = localtime(&t);
+       // TODO we should check if the function returns NULL, which would mean error
+#ifdef _WIN32
+       localtime_s(&ret, &t);
+#else
+       localtime_r(&t, &ret);
+#endif
+       return ret;
+}
+
+
+inline std::string getTimestamp()
+{
+       const struct tm tm = mt_localtime();
        char cs[20]; // YYYY-MM-DD HH:MM:SS + '\0'
-       strftime(cs, 20, "%Y-%m-%d %H:%M:%S", tm);
+       strftime(cs, 20, "%Y-%m-%d %H:%M:%S", &tm);
        return cs;
 }