Title: [199729] trunk
Revision
199729
Author
commit-qu...@webkit.org
Date
2016-04-19 09:29:54 -0700 (Tue, 19 Apr 2016)

Log Message

Unreviewed, rolling out r199726.
https://bugs.webkit.org/show_bug.cgi?id=156748

WebKit tests crash on Windows 32 (Requested by msaboff on
#webkit).

Reverted changeset:

"iTunes crashing _javascript_Core.dll"
https://bugs.webkit.org/show_bug.cgi?id=156647
http://trac.webkit.org/changeset/199726

Modified Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (199728 => 199729)


--- trunk/LayoutTests/ChangeLog	2016-04-19 15:48:00 UTC (rev 199728)
+++ trunk/LayoutTests/ChangeLog	2016-04-19 16:29:54 UTC (rev 199729)
@@ -1,3 +1,17 @@
+2016-04-19  Commit Queue  <commit-qu...@webkit.org>
+
+        Unreviewed, rolling out r199726.
+        https://bugs.webkit.org/show_bug.cgi?id=156748
+
+        WebKit tests crash on Windows 32 (Requested by msaboff on
+        #webkit).
+
+        Reverted changeset:
+
+        "iTunes crashing _javascript_Core.dll"
+        https://bugs.webkit.org/show_bug.cgi?id=156647
+        http://trac.webkit.org/changeset/199726
+
 2016-04-19  Sergio Villar Senin  <svil...@igalia.com>
 
         [css-grid] Use the margin box for non-auto minimum sizes

Modified: trunk/LayoutTests/platform/win/TestExpectations (199728 => 199729)


--- trunk/LayoutTests/platform/win/TestExpectations	2016-04-19 15:48:00 UTC (rev 199728)
+++ trunk/LayoutTests/platform/win/TestExpectations	2016-04-19 16:29:54 UTC (rev 199729)
@@ -437,10 +437,6 @@
 storage/storagequota-request-quota.html [ Skip ]
 fast/workers/worker-storagequota-query-usage.html [ Skip ]
 
-# The number of workers in this test exceeds the number of
-# ThreadSpecificValues we have on Windows.
-fast/workers/dedicated-worker-lifecycle.html [ Skip ] 
-
 # Tests that require ENABLE(DOWNLOAD_ATTRIBUTE).
 fast/dom/HTMLAnchorElement/anchor-nodownload.html [ Skip ]
 fast/dom/HTMLAnchorElement/anchor-download.html [ Skip ]

Modified: trunk/Source/_javascript_Core/ChangeLog (199728 => 199729)


--- trunk/Source/_javascript_Core/ChangeLog	2016-04-19 15:48:00 UTC (rev 199728)
+++ trunk/Source/_javascript_Core/ChangeLog	2016-04-19 16:29:54 UTC (rev 199729)
@@ -1,3 +1,17 @@
+2016-04-19  Commit Queue  <commit-qu...@webkit.org>
+
+        Unreviewed, rolling out r199726.
+        https://bugs.webkit.org/show_bug.cgi?id=156748
+
+        WebKit tests crash on Windows 32 (Requested by msaboff on
+        #webkit).
+
+        Reverted changeset:
+
+        "iTunes crashing _javascript_Core.dll"
+        https://bugs.webkit.org/show_bug.cgi?id=156647
+        http://trac.webkit.org/changeset/199726
+
 2016-04-19  Michael Saboff  <msab...@apple.com>
 
         iTunes crashing _javascript_Core.dll

Modified: trunk/Source/_javascript_Core/heap/MachineStackMarker.cpp (199728 => 199729)


--- trunk/Source/_javascript_Core/heap/MachineStackMarker.cpp	2016-04-19 15:48:00 UTC (rev 199728)
+++ trunk/Source/_javascript_Core/heap/MachineStackMarker.cpp	2016-04-19 16:29:54 UTC (rev 199729)
@@ -192,12 +192,14 @@
 MachineThreads::MachineThreads(Heap* heap)
     : m_registeredThreads(0)
     , m_threadSpecificForMachineThreads(0)
+    , m_threadSpecificForThread(0)
 #if !ASSERT_DISABLED
     , m_heap(heap)
 #endif
 {
     UNUSED_PARAM(heap);
     threadSpecificKeyCreate(&m_threadSpecificForMachineThreads, removeThread);
+    threadSpecificKeyCreate(&m_threadSpecificForThread, nullptr);
     activeMachineThreadsManager().add(this);
 }
 
@@ -205,6 +207,7 @@
 {
     activeMachineThreadsManager().remove(this);
     threadSpecificKeyDelete(m_threadSpecificForMachineThreads);
+    threadSpecificKeyDelete(m_threadSpecificForThread);
 
     LockHolder registeredThreadsLock(m_registeredThreadsMutex);
     for (Thread* t = m_registeredThreads; t;) {
@@ -231,6 +234,18 @@
 #endif
 }
 
+#ifndef NDEBUG
+static bool isThreadInList(Thread* listHead, Thread* target)
+{
+    for (Thread* thread = listHead; thread; thread = thread->next) {
+        if (thread == target)
+            return true;
+    }
+
+    return false;
+}
+#endif
+
 void MachineThreads::addCurrentThread()
 {
     ASSERT(!m_heap->vm()->hasExclusiveThread() || m_heap->vm()->exclusiveThread() == std::this_thread::get_id());
@@ -239,12 +254,15 @@
 #ifndef NDEBUG
         LockHolder lock(m_registeredThreadsMutex);
         ASSERT(threadSpecificGet(m_threadSpecificForMachineThreads) == this);
+        ASSERT(threadSpecificGet(m_threadSpecificForThread));
+        ASSERT(isThreadInList(m_registeredThreads, static_cast<Thread*>(threadSpecificGet(m_threadSpecificForThread))));
 #endif
         return;
     }
 
     Thread* thread = Thread::createForCurrentThread();
     threadSpecificSet(m_threadSpecificForMachineThreads, this);
+    threadSpecificSet(m_threadSpecificForThread, thread);
 
     LockHolder lock(m_registeredThreadsMutex);
 
@@ -254,15 +272,14 @@
 
 Thread* MachineThreads::machineThreadForCurrentThread()
 {
+    Thread* result = static_cast<Thread*>(threadSpecificGet(m_threadSpecificForThread));
+    RELEASE_ASSERT(result);
+#ifndef NDEBUG
     LockHolder lock(m_registeredThreadsMutex);
-    PlatformThread platformThread = getCurrentPlatformThread();
-    for (Thread* thread = m_registeredThreads; thread; thread = thread->next) {
-        if (*thread == platformThread)
-            return thread;
-    }
+    ASSERT(isThreadInList(m_registeredThreads, result));
+#endif
 
-    RELEASE_ASSERT_NOT_REACHED();
-    return nullptr;
+    return result;
 }
 
 void MachineThreads::removeThread(void* p)

Modified: trunk/Source/_javascript_Core/heap/MachineStackMarker.h (199728 => 199729)


--- trunk/Source/_javascript_Core/heap/MachineStackMarker.h	2016-04-19 15:48:00 UTC (rev 199728)
+++ trunk/Source/_javascript_Core/heap/MachineStackMarker.h	2016-04-19 16:29:54 UTC (rev 199729)
@@ -159,6 +159,7 @@
     Lock m_registeredThreadsMutex;
     Thread* m_registeredThreads;
     WTF::ThreadSpecificKey m_threadSpecificForMachineThreads;
+    WTF::ThreadSpecificKey m_threadSpecificForThread;
 #if !ASSERT_DISABLED
     Heap* m_heap;
 #endif

Modified: trunk/Source/WTF/ChangeLog (199728 => 199729)


--- trunk/Source/WTF/ChangeLog	2016-04-19 15:48:00 UTC (rev 199728)
+++ trunk/Source/WTF/ChangeLog	2016-04-19 16:29:54 UTC (rev 199729)
@@ -1,3 +1,17 @@
+2016-04-19  Commit Queue  <commit-qu...@webkit.org>
+
+        Unreviewed, rolling out r199726.
+        https://bugs.webkit.org/show_bug.cgi?id=156748
+
+        WebKit tests crash on Windows 32 (Requested by msaboff on
+        #webkit).
+
+        Reverted changeset:
+
+        "iTunes crashing _javascript_Core.dll"
+        https://bugs.webkit.org/show_bug.cgi?id=156647
+        http://trac.webkit.org/changeset/199726
+
 2016-04-19  Michael Saboff  <msab...@apple.com>
 
         iTunes crashing _javascript_Core.dll

Modified: trunk/Source/WTF/wtf/ThreadSpecific.h (199728 => 199729)


--- trunk/Source/WTF/wtf/ThreadSpecific.h	2016-04-19 15:48:00 UTC (rev 199728)
+++ trunk/Source/WTF/wtf/ThreadSpecific.h	2016-04-19 16:29:54 UTC (rev 199729)
@@ -94,6 +94,9 @@
 
         T* value;
         ThreadSpecific<T>* owner;
+#if OS(WINDOWS)
+        void (*destructor)(void*);
+#endif
     };
 
 #if USE(PTHREADS)
@@ -155,64 +158,47 @@
 
 #elif OS(WINDOWS)
 
-// The maximum number of FLS keys that can be created. For simplification, we assume that:
+// The maximum number of TLS keys that can be created. For simplification, we assume that:
 // 1) Once the instance of ThreadSpecific<> is created, it will not be destructed until the program dies.
 // 2) We do not need to hold many instances of ThreadSpecific<> data. This fixed number should be far enough.
-const int kMaxFlsKeySize = 128;
+const int kMaxTlsKeySize = 256;
 
-WTF_EXPORT_PRIVATE long& flsKeyCount();
-WTF_EXPORT_PRIVATE DWORD* flsKeys();
+WTF_EXPORT_PRIVATE long& tlsKeyCount();
+WTF_EXPORT_PRIVATE DWORD* tlsKeys();
 
-typedef DWORD ThreadSpecificKey;
+class PlatformThreadSpecificKey;
+typedef PlatformThreadSpecificKey* ThreadSpecificKey;
 
-inline void threadSpecificKeyCreate(ThreadSpecificKey* key, void (*destructor)(void *))
-{
-    DWORD flsKey = FlsAlloc(reinterpret_cast<PFLS_CALLBACK_FUNCTION>(destructor));
-    if (flsKey == FLS_OUT_OF_INDEXES)
-        CRASH();
+WTF_EXPORT_PRIVATE void threadSpecificKeyCreate(ThreadSpecificKey*, void (*)(void *));
+WTF_EXPORT_PRIVATE void threadSpecificKeyDelete(ThreadSpecificKey);
+WTF_EXPORT_PRIVATE void threadSpecificSet(ThreadSpecificKey, void*);
+WTF_EXPORT_PRIVATE void* threadSpecificGet(ThreadSpecificKey);
 
-    *key = flsKey;
-}
-
-inline void threadSpecificKeyDelete(ThreadSpecificKey key)
-{
-    FlsFree(key);
-}
-
-inline void threadSpecificSet(ThreadSpecificKey key, void* data)
-{
-    FlsSetValue(key, data);
-}
-
-inline void* threadSpecificGet(ThreadSpecificKey key)
-{
-    return FlsGetValue(key);
-}
-
 template<typename T>
 inline ThreadSpecific<T>::ThreadSpecific()
     : m_index(-1)
 {
-    DWORD flsKey = FlsAlloc(reinterpret_cast<PFLS_CALLBACK_FUNCTION>(destroy));
-    if (flsKey == FLS_OUT_OF_INDEXES)
+    DWORD tlsKey = TlsAlloc();
+    if (tlsKey == TLS_OUT_OF_INDEXES)
         CRASH();
 
-    m_index = InterlockedIncrement(&flsKeyCount()) - 1;
-    if (m_index >= kMaxFlsKeySize)
+    m_index = InterlockedIncrement(&tlsKeyCount()) - 1;
+    if (m_index >= kMaxTlsKeySize)
         CRASH();
-    flsKeys()[m_index] = flsKey;
+    tlsKeys()[m_index] = tlsKey;
 }
 
 template<typename T>
 inline ThreadSpecific<T>::~ThreadSpecific()
 {
-    FlsFree(flsKeys()[m_index]);
+    // Does not invoke destructor functions. They will be called from ThreadSpecificThreadExit when the thread is detached.
+    TlsFree(tlsKeys()[m_index]);
 }
 
 template<typename T>
 inline T* ThreadSpecific<T>::get()
 {
-    Data* data = ""
+    Data* data = ""
     return data ? data->value : 0;
 }
 
@@ -221,7 +207,8 @@
 {
     ASSERT(!get());
     Data* data = "" Data(ptr, this);
-    FlsSetValue(flsKeys()[m_index], data);
+    data->destructor = &ThreadSpecific<T>::destroy;
+    TlsSetValue(tlsKeys()[m_index], data);
 }
 
 #else
@@ -245,7 +232,7 @@
 #if USE(PTHREADS)
     pthread_setspecific(data->owner->m_key, 0);
 #elif OS(WINDOWS)
-    FlsSetValue(flsKeys()[data->owner->m_index], 0);
+    TlsSetValue(tlsKeys()[data->owner->m_index], 0);
 #else
 #error ThreadSpecific is not implemented for this platform.
 #endif

Modified: trunk/Source/WTF/wtf/ThreadSpecificWin.cpp (199728 => 199729)


--- trunk/Source/WTF/wtf/ThreadSpecificWin.cpp	2016-04-19 15:48:00 UTC (rev 199728)
+++ trunk/Source/WTF/wtf/ThreadSpecificWin.cpp	2016-04-19 16:29:54 UTC (rev 199729)
@@ -24,22 +24,117 @@
 
 #if OS(WINDOWS)
 
+#include "StdLibExtras.h"
+#include "ThreadingPrimitives.h"
+#include <wtf/DoublyLinkedList.h>
+
 #if !USE(PTHREADS)
 
 namespace WTF {
 
-long& flsKeyCount()
+static DoublyLinkedList<PlatformThreadSpecificKey>& destructorsList()
 {
+    static DoublyLinkedList<PlatformThreadSpecificKey> staticList;
+    return staticList;
+}
+
+static Mutex& destructorsMutex()
+{
+    static Mutex staticMutex;
+    return staticMutex;
+}
+
+class PlatformThreadSpecificKey : public DoublyLinkedListNode<PlatformThreadSpecificKey> {
+public:
+    friend class DoublyLinkedListNode<PlatformThreadSpecificKey>;
+
+    PlatformThreadSpecificKey(void (*destructor)(void *))
+        : m_destructor(destructor)
+    {
+        m_tlsKey = TlsAlloc();
+        if (m_tlsKey == TLS_OUT_OF_INDEXES)
+            CRASH();
+    }
+
+    ~PlatformThreadSpecificKey()
+    {
+        TlsFree(m_tlsKey);
+    }
+
+    void setValue(void* data) { TlsSetValue(m_tlsKey, data); }
+    void* value() { return TlsGetValue(m_tlsKey); }
+
+    void callDestructor()
+    {
+       if (void* data = ""
+            m_destructor(data);
+    }
+
+private:
+    void (*m_destructor)(void *);
+    DWORD m_tlsKey;
+    PlatformThreadSpecificKey* m_prev;
+    PlatformThreadSpecificKey* m_next;
+};
+
+long& tlsKeyCount()
+{
     static long count;
     return count;
 }
 
-DWORD* flsKeys()
+DWORD* tlsKeys()
 {
-    static DWORD keys[kMaxFlsKeySize];
+    static DWORD keys[kMaxTlsKeySize];
     return keys;
 }
 
+void threadSpecificKeyCreate(ThreadSpecificKey* key, void (*destructor)(void *))
+{
+    // Use the original malloc() instead of fastMalloc() to use this function in FastMalloc code.
+    *key = static_cast<PlatformThreadSpecificKey*>(::malloc(sizeof(PlatformThreadSpecificKey)));
+    new (*key) PlatformThreadSpecificKey(destructor);
+
+    MutexLocker locker(destructorsMutex());
+    destructorsList().push(*key);
+}
+
+void threadSpecificKeyDelete(ThreadSpecificKey key)
+{
+    MutexLocker locker(destructorsMutex());
+    destructorsList().remove(key);
+    key->~PlatformThreadSpecificKey();
+    ::free(key);
+}
+
+void threadSpecificSet(ThreadSpecificKey key, void* data)
+{
+    key->setValue(data);
+}
+
+void* threadSpecificGet(ThreadSpecificKey key)
+{
+    return key->value();
+}
+
+void ThreadSpecificThreadExit()
+{
+    for (long i = 0; i < tlsKeyCount(); i++) {
+        // The layout of ThreadSpecific<T>::Data does not depend on T. So we are safe to do the static cast to ThreadSpecific<int> in order to access its data member.
+        ThreadSpecific<int>::Data* data = ""
+        if (data)
+            data->destructor(data);
+    }
+
+    MutexLocker locker(destructorsMutex());
+    PlatformThreadSpecificKey* key = destructorsList().head();
+    while (key) {
+        PlatformThreadSpecificKey* nextKey = key->next();
+        key->callDestructor();
+        key = nextKey;
+    }
+}
+
 } // namespace WTF
 
 #endif // !USE(PTHREADS)

Modified: trunk/Source/WTF/wtf/ThreadingWin.cpp (199728 => 199729)


--- trunk/Source/WTF/wtf/ThreadingWin.cpp	2016-04-19 15:48:00 UTC (rev 199728)
+++ trunk/Source/WTF/wtf/ThreadingWin.cpp	2016-04-19 16:29:54 UTC (rev 199729)
@@ -102,6 +102,10 @@
 #include <wtf/RandomNumberSeed.h>
 #include <wtf/WTFThreadData.h>
 
+#if !USE(PTHREADS) && OS(WINDOWS)
+#include "ThreadSpecific.h"
+#endif
+
 #if HAVE(ERRNO_H)
 #include <errno.h>
 #endif
@@ -195,6 +199,11 @@
     std::unique_ptr<ThreadFunctionInvocation> invocation(static_cast<ThreadFunctionInvocation*>(param));
     invocation->function(invocation->data);
 
+#if !USE(PTHREADS) && OS(WINDOWS)
+    // Do the TLS cleanup.
+    ThreadSpecificThreadExit();
+#endif
+
     return 0;
 }
 
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to