diff options
author | Corinna Vinschen <corinna@vinschen.de> | 2007-12-11 16:14:24 +0000 |
---|---|---|
committer | Corinna Vinschen <corinna@vinschen.de> | 2007-12-11 16:14:24 +0000 |
commit | ea5bc3721fdbba44585005897a62b89212534c0d (patch) | |
tree | c0a0cbbfb934b7f46fa2fffd78be5d99c174cd71 /winsup/cygwin/localtime.cc | |
parent | 3623cfa3997fd6461b9c2a9883b8e053ded7a63b (diff) | |
download | cygnal-ea5bc3721fdbba44585005897a62b89212534c0d.tar.gz cygnal-ea5bc3721fdbba44585005897a62b89212534c0d.tar.bz2 cygnal-ea5bc3721fdbba44585005897a62b89212534c0d.zip |
* localtime.cc (tzset): Guard by a muto for thread safety.
Diffstat (limited to 'winsup/cygwin/localtime.cc')
-rw-r--r-- | winsup/cygwin/localtime.cc | 12 |
1 files changed, 9 insertions, 3 deletions
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 <windows.h> #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 (); } /* |