From ea5bc3721fdbba44585005897a62b89212534c0d Mon Sep 17 00:00:00 2001 From: Corinna Vinschen Date: Tue, 11 Dec 2007 16:14:24 +0000 Subject: [PATCH] * localtime.cc (tzset): Guard by a muto for thread safety. --- winsup/cygwin/ChangeLog | 4 ++++ winsup/cygwin/localtime.cc | 12 +++++++++--- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index e358f7003..dce318d75 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,3 +1,7 @@ +2007-12-11 Corinna Vinschen + + * localtime.cc (tzset): Guard by a muto for thread safety. + 2007-12-11 Dave Korn * cygheap.cc (_csbrk): Don't request zero bytes from VirtualAlloc, diff --git a/winsup/cygwin/localtime.cc b/winsup/cygwin/localtime.cc index a2f415f08..3d08cc67b 100644 --- a/winsup/cygwin/localtime.cc +++ b/winsup/cygwin/localtime.cc @@ -6,6 +6,7 @@ #include "winsup.h" #include "cygerrno.h" +#include "sync.h" #include #define STD_INSPIRED #define lint @@ -1470,19 +1471,22 @@ tzsetwall P((void)) settzname(); } +static NO_COPY muto tzset_guard; + extern "C" void tzset P((void)) { + tzset_guard.init ("tzset_guard")->acquire (); const char * name = getenv("TZ"); if (name == NULL) { if (!lcl_is_set) tzsetwall(); - return; + goto out; } if (lcl_is_set > 0 && strcmp(lcl_TZname, name) == 0) - return; + goto out; lcl_is_set = (strlen(name) < sizeof (lcl_TZname)); if (lcl_is_set) strcpy(lcl_TZname, name); @@ -1492,7 +1496,7 @@ tzset P((void)) lclptr = (struct state *) malloc(sizeof *lclptr); if (lclptr == NULL) { settzname(); /* all we can do */ - return; + goto out; } } #endif /* defined ALL_STATE */ @@ -1510,6 +1514,8 @@ tzset P((void)) gmtload(lclptr); } settzname(); +out: + tzset_guard.release (); } /*