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