]> git.saurik.com Git - wxWidgets.git/commitdiff
Added implementation for wxLocaltime_r/wxGmtime_r.
authorStefan Neis <Stefan.Neis@t-online.de>
Sun, 18 Dec 2005 19:24:11 +0000 (19:24 +0000)
committerStefan Neis <Stefan.Neis@t-online.de>
Sun, 18 Dec 2005 19:24:11 +0000 (19:24 +0000)
Improved handling of windows compilers.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@36438 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

include/wx/datetime.h
src/common/datetime.cpp

index 42d9e4f926ccee91f49a0404fc3ff7bace3427a4..2f331299ade4cc4d1b9785eec0f810ff6a3a5631 100644 (file)
@@ -57,15 +57,21 @@ class WXDLLIMPEXP_BASE wxDateSpan;
 #define wxLocaltime_r localtime_r
 #else
 struct tm *wxLocaltime_r(const time_t*, struct tm*);
 #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
 #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*);
 
 #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
 #warning using pseudo thread-safe wrapper for gmtime to emulate gmtime_r
 #endif
+#endif
 
 /*
   The three (main) classes declared in this header represent:
 
 /*
   The three (main) classes declared in this header represent:
index 8448eb1a5ed0281778789ad143f1d815bcfab343..12732e144b010de690fd276371e9cb5917e2c8c9 100644 (file)
@@ -169,6 +169,36 @@ wxCUSTOM_TYPE_INFO(wxDateTime, wxToStringConverter<wxDateTime> , wxFromStringCon
     #endif
 #endif // !WX_TIMEZONE && !WX_GMTOFF_IN_TM
 
     #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
 // ----------------------------------------------------------------------------
 // ----------------------------------------------------------------------------
 // macros
 // ----------------------------------------------------------------------------