diff options
author | Lorry Tar Creator <lorry-tar-importer@lorry> | 2017-06-27 06:07:23 +0000 |
---|---|---|
committer | Lorry Tar Creator <lorry-tar-importer@lorry> | 2017-06-27 06:07:23 +0000 |
commit | 1bf1084f2b10c3b47fd1a588d85d21ed0eb41d0c (patch) | |
tree | 46dcd36c86e7fbc6e5df36deb463b33e9967a6f7 /Source/WTF/wtf/ThreadSpecificWin.cpp | |
parent | 32761a6cee1d0dee366b885b7b9c777e67885688 (diff) | |
download | WebKitGtk-tarball-master.tar.gz |
webkitgtk-2.16.5HEADwebkitgtk-2.16.5master
Diffstat (limited to 'Source/WTF/wtf/ThreadSpecificWin.cpp')
-rw-r--r-- | Source/WTF/wtf/ThreadSpecificWin.cpp | 101 |
1 files changed, 3 insertions, 98 deletions
diff --git a/Source/WTF/wtf/ThreadSpecificWin.cpp b/Source/WTF/wtf/ThreadSpecificWin.cpp index 9b70bbbca..ad7cf86d4 100644 --- a/Source/WTF/wtf/ThreadSpecificWin.cpp +++ b/Source/WTF/wtf/ThreadSpecificWin.cpp @@ -24,117 +24,22 @@ #if OS(WINDOWS) -#include "StdLibExtras.h" -#include "ThreadingPrimitives.h" -#include <wtf/DoublyLinkedList.h> - #if !USE(PTHREADS) namespace WTF { -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 = value()) - m_destructor(data); - } - -private: - void (*m_destructor)(void *); - DWORD m_tlsKey; - PlatformThreadSpecificKey* m_prev; - PlatformThreadSpecificKey* m_next; -}; - -long& tlsKeyCount() +long& flsKeyCount() { static long count; return count; } -DWORD* tlsKeys() +DWORD* flsKeys() { - static DWORD keys[kMaxTlsKeySize]; + static DWORD keys[kMaxFlsKeySize]; 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 = static_cast<ThreadSpecific<int>::Data*>(TlsGetValue(tlsKeys()[i])); - 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) |