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
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to