Avoid excessive locking and calling tzset in time functions.
* libc/time/lcltime_r.c (localtime_r): Call _tzset_unlocked inside TZ lock. * libc/time/mktime.c (mktime): Ditto. * libc/time/strftime.c (strftime, wcsftime): Ditto. Guard against calling _tzset_unlocked more than once (baring recursion). Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
This commit is contained in:
parent
5f4e1e895c
commit
70399a721c
@ -1,3 +1,11 @@
|
|||||||
|
2015-03-31 Corinna Vinschen <vinschen@redhat.com>
|
||||||
|
|
||||||
|
* libc/time/lcltime_r.c (localtime_r): Call _tzset_unlocked inside
|
||||||
|
TZ lock.
|
||||||
|
* libc/time/mktime.c (mktime): Ditto.
|
||||||
|
* libc/time/strftime.c (strftime, wcsftime): Ditto. Guard against
|
||||||
|
calling _tzset_unlocked more than once (baring recursion).
|
||||||
|
|
||||||
2015-03-31 Corinna Vinschen <vinschen@redhat.com>
|
2015-03-31 Corinna Vinschen <vinschen@redhat.com>
|
||||||
|
|
||||||
* libc/time/local.h (_tzset_unlocked_r): Add prototype.
|
* libc/time/local.h (_tzset_unlocked_r): Add prototype.
|
||||||
|
@ -31,8 +31,8 @@ _DEFUN (localtime_r, (tim_p, res),
|
|||||||
year = res->tm_year + YEAR_BASE;
|
year = res->tm_year + YEAR_BASE;
|
||||||
ip = __month_lengths[isleap(year)];
|
ip = __month_lengths[isleap(year)];
|
||||||
|
|
||||||
tzset ();
|
|
||||||
TZ_LOCK;
|
TZ_LOCK;
|
||||||
|
_tzset_unlocked ();
|
||||||
if (_daylight)
|
if (_daylight)
|
||||||
{
|
{
|
||||||
if (year == tz->__tzyear || __tzcalc_limits (year))
|
if (year == tz->__tzyear || __tzcalc_limits (year))
|
||||||
|
@ -197,10 +197,10 @@ _DEFUN(mktime, (tim_p),
|
|||||||
/* compute total seconds */
|
/* compute total seconds */
|
||||||
tim += (days * _SEC_IN_DAY);
|
tim += (days * _SEC_IN_DAY);
|
||||||
|
|
||||||
tzset ();
|
|
||||||
|
|
||||||
TZ_LOCK;
|
TZ_LOCK;
|
||||||
|
|
||||||
|
_tzset_unlocked ();
|
||||||
|
|
||||||
if (_daylight)
|
if (_daylight)
|
||||||
{
|
{
|
||||||
int tm_isdst;
|
int tm_isdst;
|
||||||
|
@ -703,6 +703,7 @@ _DEFUN (strftime, (s, maxsize, format, tim_p),
|
|||||||
CHAR alt;
|
CHAR alt;
|
||||||
CHAR pad;
|
CHAR pad;
|
||||||
unsigned long width;
|
unsigned long width;
|
||||||
|
int tzset_called = 0;
|
||||||
|
|
||||||
struct lc_time_T *_CurrentTimeLocale = __get_current_time_locale ();
|
struct lc_time_T *_CurrentTimeLocale = __get_current_time_locale ();
|
||||||
for (;;)
|
for (;;)
|
||||||
@ -1283,7 +1284,13 @@ recurse:
|
|||||||
if (tim_p->tm_isdst >= 0)
|
if (tim_p->tm_isdst >= 0)
|
||||||
{
|
{
|
||||||
long offset;
|
long offset;
|
||||||
tzset ();
|
|
||||||
|
TZ_LOCK;
|
||||||
|
if (!tzset_called)
|
||||||
|
{
|
||||||
|
_tzset_unlocked ();
|
||||||
|
tzset_called = 1;
|
||||||
|
}
|
||||||
|
|
||||||
#if defined (__CYGWIN__)
|
#if defined (__CYGWIN__)
|
||||||
/* Cygwin must check if the application has been built with or
|
/* Cygwin must check if the application has been built with or
|
||||||
@ -1302,6 +1309,7 @@ recurse:
|
|||||||
but have to use __tzrule for daylight savings. */
|
but have to use __tzrule for daylight savings. */
|
||||||
offset = -tz->__tzrule[tim_p->tm_isdst > 0].offset;
|
offset = -tz->__tzrule[tim_p->tm_isdst > 0].offset;
|
||||||
#endif
|
#endif
|
||||||
|
TZ_UNLOCK;
|
||||||
len = snprintf (&s[count], maxsize - count, CQ("%+03ld%.2ld"),
|
len = snprintf (&s[count], maxsize - count, CQ("%+03ld%.2ld"),
|
||||||
offset / SECSPERHOUR,
|
offset / SECSPERHOUR,
|
||||||
labs (offset / SECSPERMIN) % 60L);
|
labs (offset / SECSPERMIN) % 60L);
|
||||||
@ -1314,8 +1322,12 @@ recurse:
|
|||||||
size_t size;
|
size_t size;
|
||||||
const char *tznam = NULL;
|
const char *tznam = NULL;
|
||||||
|
|
||||||
tzset ();
|
|
||||||
TZ_LOCK;
|
TZ_LOCK;
|
||||||
|
if (!tzset_called)
|
||||||
|
{
|
||||||
|
_tzset_unlocked ();
|
||||||
|
tzset_called = 1;
|
||||||
|
}
|
||||||
#if defined (__CYGWIN__)
|
#if defined (__CYGWIN__)
|
||||||
/* See above. */
|
/* See above. */
|
||||||
extern const char *__cygwin_gettzname (const struct tm *tmp);
|
extern const char *__cygwin_gettzname (const struct tm *tmp);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user