summaryrefslogtreecommitdiff
path: root/src/gettime.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/gettime.h')
-rw-r--r--src/gettime.h32
1 files changed, 27 insertions, 5 deletions
diff --git a/src/gettime.h b/src/gettime.h
index 66efef1d7..772ff9b50 100644
--- a/src/gettime.h
+++ b/src/gettime.h
@@ -21,6 +21,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include <ctime>
#include <string>
+#include <mutex>
enum TimePrecision
{
@@ -30,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;
}