2009-06-01 Dmitry Titov <dimich@chromium.org>
authordimich@chromium.org <dimich@chromium.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 1 Jun 2009 19:44:20 +0000 (19:44 +0000)
committerdimich@chromium.org <dimich@chromium.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 1 Jun 2009 19:44:20 +0000 (19:44 +0000)
        Reviewed by Darin Adler.

        https://bugs.webkit.org/show_bug.cgi?id=25973
        Avoid calling CurrentThread() in thread-specific destructors in OSX Chromium.
        Pthreads invoke thread-specific destructors after WTF::detachThread() is called and ThreadIdentifier
        for the thread removed from the WTF thread map. Calling CurrentThread() in such destructor causes
        the ThreadIdentifier to be re-created and inserted into the map again. Since Pthreads on OSX reuse
        the pthread_t between threads, the next created thread will have the same pthread_t and cause an assert
        in establishIdentifierForPthreadHandle() since the id is already in the map.

        The behavior is covered by existing test LayoutTests/fast/workers/worker-terminate.html, which currently fails
        on OSX Chromium and will stop failing after this change.

        * platform/ThreadGlobalData.h:
        * platform/ThreadGlobalData.cpp:
        (WebCore::ThreadGlobalData::~ThreadGlobalData):
        Store the result of "isMainThread()" in a member variable during construction of thread-specific data
        to avoid calling IsMainThread() in destructor, since the latter calls CurrentThread() in OSX Chromium.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@44327 268f45cc-cd09-0410-ab3c-d52691b4dbfc

WebCore/ChangeLog
WebCore/platform/ThreadGlobalData.cpp
WebCore/platform/ThreadGlobalData.h

index 864ca3f..9eab461 100644 (file)
@@ -1,3 +1,24 @@
+2009-06-01  Dmitry Titov  <dimich@chromium.org>
+
+        Reviewed by Darin Adler.
+
+        https://bugs.webkit.org/show_bug.cgi?id=25973
+        Avoid calling CurrentThread() in thread-specific destructors in OSX Chromium.
+        Pthreads invoke thread-specific destructors after WTF::detachThread() is called and ThreadIdentifier
+        for the thread removed from the WTF thread map. Calling CurrentThread() in such destructor causes
+        the ThreadIdentifier to be re-created and inserted into the map again. Since Pthreads on OSX reuse
+        the pthread_t between threads, the next created thread will have the same pthread_t and cause an assert
+        in establishIdentifierForPthreadHandle() since the id is already in the map.
+
+        The behavior is covered by existing test LayoutTests/fast/workers/worker-terminate.html, which currently fails
+        on OSX Chromium and will stop failing after this change.
+
+        * platform/ThreadGlobalData.h:
+        * platform/ThreadGlobalData.cpp:
+        (WebCore::ThreadGlobalData::~ThreadGlobalData):
+        Store the result of "isMainThread()" in a member variable during construction of thread-specific data
+        to avoid calling IsMainThread() in destructor, since the latter calls CurrentThread() in OSX Chromium.
+
 2009-06-01  David Levin  <levin@chromium.org>
 
         Reviewed by Darin Alder and Maciej Stachowiak.
index a3aa158..1351dda 100644 (file)
@@ -72,6 +72,9 @@ ThreadGlobalData::ThreadGlobalData()
     , m_atomicStringTable(new HashSet<StringImpl*>)
     , m_eventNames(new EventNames)
     , m_threadTimers(new ThreadTimers)
+#ifndef NDEBUG
+    , m_isMainThread(isMainThread())
+#endif
 #if USE(ICU_UNICODE) || USE(GLIB_ICU_UNICODE_HYBRID)
     , m_cachedConverterICU(new ICUConverterWrapper)
 #endif
@@ -94,7 +97,8 @@ ThreadGlobalData::~ThreadGlobalData()
     delete m_atomicStringTable;
     delete m_threadTimers;
 
-    ASSERT(isMainThread() || m_emptyString->hasOneRef()); // We intentionally don't clean up static data on application quit, so there will be many strings remaining on the main thread.
+    ASSERT(m_isMainThread || m_emptyString->hasOneRef()); // We intentionally don't clean up static data on application quit, so there will be many strings remaining on the main thread.
+
     delete m_emptyString;
 }
 
index 75c1b4b..e0aa092 100644 (file)
@@ -62,6 +62,10 @@ namespace WebCore {
         EventNames* m_eventNames;
         ThreadTimers* m_threadTimers;
 
+#ifndef NDEBUG
+        bool m_isMainThread;
+#endif
+
 #if USE(ICU_UNICODE) || USE(GLIB_ICU_UNICODE_HYBRID)
         ICUConverterWrapper* m_cachedConverterICU;
 #endif