summaryrefslogtreecommitdiffstats
path: root/JavaScriptCore/wtf/ThreadSpecific.h
diff options
context:
space:
mode:
Diffstat (limited to 'JavaScriptCore/wtf/ThreadSpecific.h')
-rw-r--r--JavaScriptCore/wtf/ThreadSpecific.h43
1 files changed, 40 insertions, 3 deletions
diff --git a/JavaScriptCore/wtf/ThreadSpecific.h b/JavaScriptCore/wtf/ThreadSpecific.h
index 8aaaf5f..b07a9a2 100644
--- a/JavaScriptCore/wtf/ThreadSpecific.h
+++ b/JavaScriptCore/wtf/ThreadSpecific.h
@@ -45,13 +45,15 @@
#if USE(PTHREADS)
#include <pthread.h>
+#elif PLATFORM(QT)
+#include <QThreadStorage>
#elif PLATFORM(WIN_OS)
#include <windows.h>
#endif
namespace WTF {
-#if !USE(PTHREADS) && PLATFORM(WIN_OS)
+#if !USE(PTHREADS) && !PLATFORM(QT) && PLATFORM(WIN_OS)
// ThreadSpecificThreadExit should be called each time when a thread is detached.
// This is done automatically for threads created with WTF::createThread.
void ThreadSpecificThreadExit();
@@ -66,7 +68,7 @@ public:
~ThreadSpecific();
private:
-#if !USE(PTHREADS) && PLATFORM(WIN_OS)
+#if !USE(PTHREADS) && !PLATFORM(QT) && PLATFORM(WIN_OS)
friend void ThreadSpecificThreadExit();
#endif
@@ -74,7 +76,7 @@ private:
void set(T*);
void static destroy(void* ptr);
-#if USE(PTHREADS) || PLATFORM(WIN_OS)
+#if USE(PTHREADS) || PLATFORM(QT) || PLATFORM(WIN_OS)
struct Data : Noncopyable {
Data(T* value, ThreadSpecific<T>* owner) : value(value), owner(owner) {}
@@ -88,6 +90,8 @@ private:
#if USE(PTHREADS)
pthread_key_t m_key;
+#elif PLATFORM(QT)
+ QThreadStorage<Data*> m_key;
#elif PLATFORM(WIN_OS)
int m_index;
#endif
@@ -122,6 +126,37 @@ inline void ThreadSpecific<T>::set(T* ptr)
pthread_setspecific(m_key, new Data(ptr, this));
}
+#elif PLATFORM(QT)
+
+template<typename T>
+inline ThreadSpecific<T>::ThreadSpecific()
+{
+}
+
+template<typename T>
+inline ThreadSpecific<T>::~ThreadSpecific()
+{
+ Data* data = static_cast<Data*>(m_key.localData());
+ if (data)
+ data->destructor(data);
+}
+
+template<typename T>
+inline T* ThreadSpecific<T>::get()
+{
+ Data* data = static_cast<Data*>(m_key.localData());
+ return data ? data->value : 0;
+}
+
+template<typename T>
+inline void ThreadSpecific<T>::set(T* ptr)
+{
+ ASSERT(!get());
+ Data* data = new Data(ptr, this);
+ data->destructor = &ThreadSpecific<T>::destroy;
+ m_key.setLocalData(data);
+}
+
#elif PLATFORM(WIN_OS)
// The maximum number of TLS keys that can be created. For simplification, we assume that:
@@ -189,6 +224,8 @@ inline void ThreadSpecific<T>::destroy(void* ptr)
#if USE(PTHREADS)
pthread_setspecific(data->owner->m_key, 0);
+#elif PLATFORM(QT)
+ data->owner->m_key.setLocalData(0);
#elif PLATFORM(WIN_OS)
TlsSetValue(tlsKeys()[data->owner->m_index], 0);
#else