Unreviewed, rolling out r91082, r91087, and r91089.
[WebKit-https.git] / Source / JavaScriptCore / wtf / ThreadIdentifierDataPthreads.cpp
index c384a26348fb4b98cdc698af9ad4275e13aef95c..dcbc96ffc44b03260a577f2d9559eacfdfc34324 100644 (file)
 
 #include "Threading.h"
 
-#include <pthread.h>
-
 namespace WTF {
 
-pthread_key_t ThreadIdentifierData::m_key = PTHREAD_KEYS_MAX;
+pthread_key_t ThreadIdentifierData::m_key;
+static pthread_once_t onceControl = PTHREAD_ONCE_INIT;
 
 void clearPthreadHandleForIdentifier(ThreadIdentifier);
 
@@ -49,15 +48,9 @@ ThreadIdentifierData::~ThreadIdentifierData()
     clearPthreadHandleForIdentifier(m_identifier);
 }
 
-void ThreadIdentifierData::initializeOnce()
-{
-    if (pthread_key_create(&m_key, destruct))
-        CRASH();
-}
-
 ThreadIdentifier ThreadIdentifierData::identifier()
 {
-    ASSERT(m_key != PTHREAD_KEYS_MAX);
+    initializeKeyOnce();
     ThreadIdentifierData* threadIdentifierData = static_cast<ThreadIdentifierData*>(pthread_getspecific(m_key));
 
     return threadIdentifierData ? threadIdentifierData->m_identifier : 0;
@@ -66,6 +59,8 @@ ThreadIdentifier ThreadIdentifierData::identifier()
 void ThreadIdentifierData::initialize(ThreadIdentifier id)
 {
     ASSERT(!identifier());
+
+    initializeKeyOnce();
     pthread_setspecific(m_key, new ThreadIdentifierData(id));
 }
 
@@ -84,6 +79,18 @@ void ThreadIdentifierData::destruct(void* data)
     pthread_setspecific(m_key, threadIdentifierData);
 }
 
+void ThreadIdentifierData::initializeKeyOnceHelper()
+{
+    if (pthread_key_create(&m_key, destruct))
+        CRASH();
+}
+
+void ThreadIdentifierData::initializeKeyOnce()
+{
+    if (pthread_once(&onceControl, initializeKeyOnceHelper))
+        CRASH();
+}
+
 } // namespace WTF
 
 #endif // USE(PTHREADS)