#define wxLocaltime_r localtime_r
#else
struct tm *wxLocaltime_r(const time_t*, struct tm*);
+#if !defined(__WINDOWS__)
+ // On Windows, localtime _is_ threadsafe!
#warning using pseudo thread-safe wrapper for localtime to emulate localtime_r
#endif
+#endif
#ifdef HAVE_GMTIME_R
#define wxGmtime_r gmtime_r
#else
struct tm *wxGmtime_r(const time_t*, struct tm*);
+#if !defined(__WINDOWS__)
+ // On Windows, gmtime _is_ threadsafe!
#warning using pseudo thread-safe wrapper for gmtime to emulate gmtime_r
#endif
+#endif
/*
The three (main) classes declared in this header represent:
#endif
#endif // !WX_TIMEZONE && !WX_GMTOFF_IN_TM
+#if wxUSE_THREADS
+static wxMutex timeLock;
+#endif
+
+#ifndef HAVE_LOCALTIME_R
+struct tm *wxLocaltime_r(const time_t* ticks, struct tm* temp)
+{
+#if wxUSE_THREADS && !defined(__WINDOWS__)
+ // No need to waste time with a mutex on windows since it's using
+ // thread local storage for localtime anyway.
+ wxMutexLocker(timeLock);
+#endif
+ memcpy(temp, localtime(ticks), sizeof(struct tm));
+ return temp;
+}
+#endif
+
+#ifndef HAVE_GMTIME_R
+struct tm *wxGmtime_r(const time_t* ticks, struct tm* temp)
+{
+#if wxUSE_THREADS && !defined(__WINDOWS__)
+ // No need to waste time with a mutex on windows since it's
+ // using thread local storage for gmtime anyway.
+ wxMutexLocker(timeLock);
+#endif
+ memcpy(temp, gmtime(ticks), sizeof(struct tm));
+ return temp;
+}
+#endif
+
// ----------------------------------------------------------------------------
// macros
// ----------------------------------------------------------------------------