--- a/src/os/linux/vm/os_linux.cpp Mon Feb 09 17:33:06 2009 +0300
+++ b/src/os/linux/vm/os_linux.cpp Mon Feb 09 12:26:05 2009 -0800
@@ -1430,6 +1430,10 @@ char * os::local_time_string(char *buf,
t.tm_year + 1900, t.tm_mon + 1, t.tm_mday,
t.tm_hour, t.tm_min, t.tm_sec);
return buf;
+}
+
+struct tm* os::localtime_pd(const time_t* clock, struct tm* res) {
+ return localtime_r(clock, res);
}
////////////////////////////////////////////////////////////////////////////////
--- a/src/os/solaris/vm/os_solaris.cpp Mon Feb 09 17:33:06 2009 +0300
+++ b/src/os/solaris/vm/os_solaris.cpp Mon Feb 09 12:26:05 2009 -0800
@@ -321,6 +321,10 @@ size_t os::current_stack_size() {
address base = current_stack_base();
address bottom = (address)align_size_up((intptr_t)(base - size), os::vm_page_size());;
return (size_t)(base - bottom);
+}
+
+struct tm* os::localtime_pd(const time_t* clock, struct tm* res) {
+ return localtime_r(clock, res);
}
// interruptible infrastructure
--- a/src/os/windows/vm/os_windows.cpp Mon Feb 09 17:33:06 2009 +0300
+++ b/src/os/windows/vm/os_windows.cpp Mon Feb 09 12:26:05 2009 -0800
@@ -327,6 +327,14 @@ size_t os::current_stack_size() {
return sz;
}
+struct tm* os::localtime_pd(const time_t* clock, struct tm* res) {
+ const struct tm* time_struct_ptr = localtime(clock);
+ if (time_struct_ptr != NULL) {
+ *res = *time_struct_ptr;
+ return res;
+ }
+ return NULL;
+}
LONG WINAPI topLevelExceptionFilter(struct _EXCEPTION_POINTERS* exceptionInfo);
--- a/src/share/vm/runtime/os.cpp Mon Feb 09 17:33:06 2009 +0300
+++ b/src/share/vm/runtime/os.cpp Mon Feb 09 12:26:05 2009 -0800
@@ -74,13 +74,11 @@ char* os::iso8601_time(char* buffer, siz
const int milliseconds_after_second =
milliseconds_since_19700101 % milliseconds_per_microsecond;
// Convert the time value to a tm and timezone variable
- const struct tm *time_struct_temp = localtime(&seconds_since_19700101);
- if (time_struct_temp == NULL) {
- assert(false, "Failed localtime");
+ struct tm time_struct;
+ if (localtime_pd(&seconds_since_19700101, &time_struct) == NULL) {
+ assert(false, "Failed localtime_pd");
return NULL;
}
- // Save the results of localtime
- const struct tm time_struct = *time_struct_temp;
const time_t zone = timezone;
// If daylight savings time is in effect,
@@ -93,10 +91,10 @@ char* os::iso8601_time(char* buffer, siz
UTC_to_local = UTC_to_local - seconds_per_hour;
}
// Compute the time zone offset.
- // localtime(3C) sets timezone to the difference (in seconds)
+ // localtime_pd() sets timezone to the difference (in seconds)
// between UTC and and local time.
// ISO 8601 says we need the difference between local time and UTC,
- // we change the sign of the localtime(3C) result.
+ // we change the sign of the localtime_pd() result.
const time_t local_to_UTC = -(UTC_to_local);
// Then we have to figure out if if we are ahead (+) or behind (-) UTC.
char sign_local_to_UTC = '+';
--- a/src/share/vm/runtime/os.hpp Mon Feb 09 17:33:06 2009 +0300
+++ b/src/share/vm/runtime/os.hpp Mon Feb 09 12:26:05 2009 -0800
@@ -120,7 +120,8 @@ class os: AllStatic {
// Return current local time in a string (YYYY-MM-DD HH:MM:SS).
// It is MT safe, but not async-safe, as reading time zone
// information may require a lock on some platforms.
- static char* local_time_string(char *buf, size_t buflen);
+ static char* local_time_string(char *buf, size_t buflen);
+ static struct tm* localtime_pd (const time_t* clock, struct tm* res);
// Fill in buffer with current local time as an ISO-8601 string.
// E.g., YYYY-MM-DDThh:mm:ss.mmm+zzzz.
// Returns buffer, or NULL if it failed.