#pragma once
-#include "irrlichttypes.h"
-#include <time.h>
+#include <ctime>
#include <string>
+#include <mutex>
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;
}