svn commit: r201270 - head/lib/libc/stdtime
John Baldwin
jhb at FreeBSD.org
Wed Dec 30 19:06:17 UTC 2009
Author: jhb
Date: Wed Dec 30 19:06:16 2009
New Revision: 201270
URL: http://svn.freebsd.org/changeset/base/201270
Log:
Use _once() to initialize the pthread key for thread-local storage to hold
the results of gmtime() instead of using a pthread mutex directly.
MFC after: 1 week
Modified:
head/lib/libc/stdtime/localtime.c
Modified: head/lib/libc/stdtime/localtime.c
==============================================================================
--- head/lib/libc/stdtime/localtime.c Wed Dec 30 18:15:25 2009 (r201269)
+++ head/lib/libc/stdtime/localtime.c Wed Dec 30 19:06:16 2009 (r201270)
@@ -237,6 +237,9 @@ static char lcl_TZname[TZ_STRLEN_MAX +
static int lcl_is_set;
static pthread_once_t gmt_once = PTHREAD_ONCE_INIT;
static pthread_rwlock_t lcl_rwlock = PTHREAD_RWLOCK_INITIALIZER;
+static pthread_once_t gmtime_once = PTHREAD_ONCE_INIT;
+static pthread_key_t gmtime_key;
+static int gmtime_key_error;
static pthread_once_t localtime_once = PTHREAD_ONCE_INIT;
static pthread_key_t localtime_key;
static int localtime_key_error;
@@ -1510,27 +1513,24 @@ struct tm * const tmp;
return result;
}
+static void
+gmtime_key_init(void)
+{
+
+ gmtime_key_error = _pthread_key_create(&gmtime_key, free);
+}
+
struct tm *
gmtime(timep)
const time_t * const timep;
{
- static pthread_mutex_t gmtime_mutex = PTHREAD_MUTEX_INITIALIZER;
- static pthread_key_t gmtime_key = -1;
struct tm *p_tm;
- int r;
if (__isthreaded != 0) {
- if (gmtime_key < 0) {
- _pthread_mutex_lock(&gmtime_mutex);
- if (gmtime_key < 0) {
- if ((r = _pthread_key_create(&gmtime_key,
- free)) != 0) {
- _pthread_mutex_unlock(&gmtime_mutex);
- errno = r;
- return(NULL);
- }
- }
- _pthread_mutex_unlock(&gmtime_mutex);
+ _once(&gmtime_once, gmtime_key_init);
+ if (gmtime_key_error != 0) {
+ errno = gmtime_key_error;
+ return(NULL);
}
/*
* Changed to follow POSIX.1 threads standard, which
More information about the svn-src-all
mailing list