]> 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 b2f09a7bb9ee7882aa35b3eee969a9b21a670c6a..772ff9b50c536ecb01c9b81f744b6420596a3883 100644 (file)
@@ -17,47 +17,48 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 */
 
-#ifndef GETTIME_HEADER
-#define GETTIME_HEADER
+#pragma once
 
-#include "irrlichttypes.h"
-
-/*
-       Get a millisecond counter value.
-       Precision depends on implementation.
-       Overflows at any value above 10000000.
+#include <ctime>
+#include <string>
+#include <mutex>
 
-       Implementation of this is done in:
-               Normal build: main.cpp
-               Server build: servermain.cpp
-*/
 enum TimePrecision
 {
-       PRECISION_SECONDS = 0,
+       PRECISION_SECONDS,
        PRECISION_MILLI,
        PRECISION_MICRO,
        PRECISION_NANO
 };
 
-extern u32 getTimeMs();
-extern u32 getTime(TimePrecision prec);
+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
+               });
 
-/*
-       Timestamp stuff
-*/
+       struct tm ret;
+       time_t t = time(NULL);
+       // 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;
+}
 
-#include <string>
-#include <time.h>
 
 inline std::string getTimestamp()
 {
-       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);
+       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;
 }
-
-#endif