diff options
author | Kevin Easton <kevin@guarana.org> | 2015-02-24 23:57:07 -0500 |
---|---|---|
committer | Mike Frysinger <vapier@gentoo.org> | 2015-02-24 23:58:59 -0500 |
commit | 6807b1db8233ed84671f061b5d825622233df303 (patch) | |
tree | bb908172e2818cf53b090c206b213c9d0cb652d2 | |
parent | b433df00ae7b72053b2aac5bea1ded269ea92589 (diff) | |
download | glibc-6807b1db8233ed84671f061b5d825622233df303.tar.gz glibc-6807b1db8233ed84671f061b5d825622233df303.tar.xz glibc-6807b1db8233ed84671f061b5d825622233df303.zip |
Reduce lock contention in __tz_convert() [BZ #16145] (partial fix)
This patch is an "easy win" partial fix for BZ #16145, which notes the heavy contention on tzset_lock when multiple threads are converting times with localtime_r(). In __tz_convert(), the lock does not need to be held after __tzfile_compute() / __tz_compute() have been called, so we can move the unlock up. At this point there is still significant work to be done in __offtime(), so we see some improvement (in my testing with 8 cores banging on localtime_r(), ~20% improvement in throughput).
-rw-r--r-- | ChangeLog | 6 | ||||
-rw-r--r-- | time/tzset.c | 4 |
2 files changed, 8 insertions, 2 deletions
diff --git a/ChangeLog b/ChangeLog index e6db8ef0ba..0d5c1f1fd2 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2015-02-24 Kevin Easton <kevin@guarana.org> + + [BZ #16145] (partial fix) + * time/tzset.c (__tz_convert): Unlock tzset_lock earlier + to reduce lock contention. + 2015-02-24 Miroslav Lichvar <mlichvar@redhat.com> * sysdeps/unix/sysv/linux/bits/timex.h: Update version. diff --git a/time/tzset.c b/time/tzset.c index 8bc7a2e05b..82324ca980 100644 --- a/time/tzset.c +++ b/time/tzset.c @@ -644,6 +644,8 @@ __tz_convert (const time_t *timer, int use_localtime, struct tm *tp) leap_extra_secs = 0; } + __libc_lock_unlock (tzset_lock); + if (tp) { if (! use_localtime) @@ -659,8 +661,6 @@ __tz_convert (const time_t *timer, int use_localtime, struct tm *tp) tp = NULL; } - __libc_lock_unlock (tzset_lock); - return tp; } |