diff options
author | Corinna Vinschen <corinna@vinschen.de> | 2015-03-31 11:14:22 +0200 |
---|---|---|
committer | Corinna Vinschen <corinna@vinschen.de> | 2015-04-23 21:57:08 +0200 |
commit | c11779332651dd2f3b12f5ec48202fa7e547272b (patch) | |
tree | 5480c352463a0d12e8f9c44e68fc44c83a7162a1 /newlib | |
parent | 382fa90fe1fdd0f363088a28a5be12a4548099b4 (diff) | |
download | newlib-c11779332651dd2f3b12f5ec48202fa7e547272b.zip newlib-c11779332651dd2f3b12f5ec48202fa7e547272b.tar.gz newlib-c11779332651dd2f3b12f5ec48202fa7e547272b.tar.bz2 |
Add _tzset_unlocked and _tzset_unlocked_r
newlib:
* libc/time/local.h (_tzset_unlocked_r): Add prototype.
(_tzset_unlocked): Ditto.
* libc/time/tzset.c (_tzset_unlocked): New function, call
_tzset_unlocked_r.
(tzset): Lock and call _tzset_unlocked_r.
* libc/time/tzset_r (_tzset_unlocked_r): Remove locking and rename
from _tzset_r.
(_tzset_r): Lock and call _tzset_unlocked_r.
cygwin:
* localtime.cc (tzset_unlocked): Export as _tzset_unlocked.
Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
Diffstat (limited to 'newlib')
-rw-r--r-- | newlib/ChangeLog | 11 | ||||
-rw-r--r-- | newlib/libc/time/local.h | 3 | ||||
-rw-r--r-- | newlib/libc/time/tzset.c | 10 | ||||
-rw-r--r-- | newlib/libc/time/tzset_r.c | 34 |
4 files changed, 35 insertions, 23 deletions
diff --git a/newlib/ChangeLog b/newlib/ChangeLog index c214b69..420354e 100644 --- a/newlib/ChangeLog +++ b/newlib/ChangeLog @@ -1,3 +1,14 @@ +2015-03-31 Corinna Vinschen <vinschen@redhat.com> + + * libc/time/local.h (_tzset_unlocked_r): Add prototype. + (_tzset_unlocked): Ditto. + * libc/time/tzset.c (_tzset_unlocked): New function, call + _tzset_unlocked_r. + (tzset): Lock and call _tzset_unlocked_r. + * libc/time/tzset_r (_tzset_unlocked_r): Remove locking and rename + from _tzset_r. + (_tzset_r): Lock and call _tzset_unlocked_r. + 2015-03-30 Craig Howland <howland@LGSInnovations.com> * libc/stdlib/setenv_r.c (_setenv_r): Remove tzset() call for TZ diff --git a/newlib/libc/time/local.h b/newlib/libc/time/local.h index 5fc3ddc..af5793a 100644 --- a/newlib/libc/time/local.h +++ b/newlib/libc/time/local.h @@ -23,6 +23,9 @@ int _EXFUN (__tzcalc_limits, (int __year)); extern _CONST int __month_lengths[2][MONSPERYEAR]; +_VOID _EXFUN(_tzset_unlocked_r, (struct _reent *)); +_VOID _EXFUN(_tzset_unlocked, (_VOID)); + /* locks for multi-threading */ #ifdef __SINGLE_THREAD__ #define TZ_LOCK diff --git a/newlib/libc/time/tzset.c b/newlib/libc/time/tzset.c index d847a26..5c421a5 100644 --- a/newlib/libc/time/tzset.c +++ b/newlib/libc/time/tzset.c @@ -68,7 +68,15 @@ Supporting OS subroutine required: None #include "local.h" _VOID +_DEFUN_VOID (_tzset_unlocked) +{ + _tzset_unlocked_r (_REENT); +} + +_VOID _DEFUN_VOID (tzset) { - _tzset_r (_REENT); + TZ_LOCK; + _tzset_unlocked_r (_REENT); + TZ_UNLOCK; } diff --git a/newlib/libc/time/tzset_r.c b/newlib/libc/time/tzset_r.c index 2c5b723..6c21e82 100644 --- a/newlib/libc/time/tzset_r.c +++ b/newlib/libc/time/tzset_r.c @@ -14,7 +14,7 @@ static char __tzname_dst[11]; static char *prev_tzenv = NULL; _VOID -_DEFUN (_tzset_r, (reent_ptr), +_DEFUN (_tzset_unlocked_r, (reent_ptr), struct _reent *reent_ptr) { char *tzenv; @@ -25,24 +25,17 @@ _DEFUN (_tzset_r, (reent_ptr), if ((tzenv = _getenv_r (reent_ptr, "TZ")) == NULL) { - TZ_LOCK; _timezone = 0; _daylight = 0; _tzname[0] = "GMT"; _tzname[1] = "GMT"; free(prev_tzenv); prev_tzenv = NULL; - TZ_UNLOCK; return; } - TZ_LOCK; - if (prev_tzenv != NULL && strcmp(tzenv, prev_tzenv) == 0) - { - TZ_UNLOCK; - return; - } + return; free(prev_tzenv); prev_tzenv = _malloc_r (reent_ptr, strlen(tzenv) + 1); @@ -54,10 +47,7 @@ _DEFUN (_tzset_r, (reent_ptr), ++tzenv; if (sscanf (tzenv, "%10[^0-9,+-]%n", __tzname_std, &n) <= 0) - { - TZ_UNLOCK; - return; - } + return; tzenv += n; @@ -74,10 +64,7 @@ _DEFUN (_tzset_r, (reent_ptr), ss = 0; if (sscanf (tzenv, "%hu%n:%hu%n:%hu%n", &hh, &n, &mm, &n, &ss, &n) < 1) - { - TZ_UNLOCK; - return; - } + return; tz->__tzrule[0].offset = sign * (ss + SECSPERMIN * mm + SECSPERHOUR * hh); _tzname[0] = __tzname_std; @@ -88,7 +75,6 @@ _DEFUN (_tzset_r, (reent_ptr), _tzname[1] = _tzname[0]; _timezone = tz->__tzrule[0].offset; _daylight = 0; - TZ_UNLOCK; return; } else @@ -127,10 +113,7 @@ _DEFUN (_tzset_r, (reent_ptr), { if (sscanf (tzenv, "M%hu%n.%hu%n.%hu%n", &m, &n, &w, &n, &d, &n) != 3 || m < 1 || m > 12 || w < 1 || w > 5 || d > 6) - { - TZ_UNLOCK; - return; - } + return; tz->__tzrule[i].ch = 'M'; tz->__tzrule[i].m = m; @@ -198,6 +181,13 @@ _DEFUN (_tzset_r, (reent_ptr), __tzcalc_limits (tz->__tzyear); _timezone = tz->__tzrule[0].offset; _daylight = tz->__tzrule[0].offset != tz->__tzrule[1].offset; +} +_VOID +_DEFUN (_tzset_r, (reent_ptr), + struct _reent *reent_ptr) +{ + TZ_LOCK; + _tzset_unlocked_r (reent_ptr); TZ_UNLOCK; } |