]> git.saurik.com Git - apple/javascriptcore.git/blobdiff - wtf/qt/ThreadingQt.cpp
JavaScriptCore-903.tar.gz
[apple/javascriptcore.git] / wtf / qt / ThreadingQt.cpp
index 1fdd2bbb9cb672823d07fdc95461dc5b627c1c33..8041dea531a3a0995a551501948e75a27a2ee4be 100644 (file)
@@ -29,6 +29,8 @@
 #include "config.h"
 #include "Threading.h"
 
+#if !ENABLE(SINGLE_THREADED)
+
 #include "CurrentTime.h"
 #include "HashMap.h"
 #include "MainThread.h"
@@ -64,10 +66,23 @@ void ThreadPrivate::run()
     m_returnValue = m_entryPoint(m_data);
 }
 
+class ThreadMonitor : public QObject {
+    Q_OBJECT
+public:
+    static ThreadMonitor * instance()
+    {
+        static ThreadMonitor *instance = new ThreadMonitor();
+        return instance;
+    }
 
-static Mutex* atomicallyInitializedStaticMutex;
+public Q_SLOTS:
+    void threadFinished()
+    {
+        sender()->deleteLater();
+    }
+};
 
-static ThreadIdentifier mainThreadIdentifier;
+static Mutex* atomicallyInitializedStaticMutex;
 
 static Mutex& threadMapMutex()
 {
@@ -129,11 +144,6 @@ void initializeThreading()
         atomicallyInitializedStaticMutex = new Mutex;
         threadMapMutex();
         initializeRandomNumberGenerator();
-        QThread* mainThread = QCoreApplication::instance()->thread();
-        mainThreadIdentifier = identifierByQthreadHandle(mainThread);
-        if (!mainThreadIdentifier)
-            mainThreadIdentifier = establishIdentifierForThread(mainThread);
-        initializeMainThread();
     }
 }
 
@@ -155,6 +165,9 @@ ThreadIdentifier createThreadInternal(ThreadFunction entryPoint, void* data, con
         LOG_ERROR("Failed to create thread at entry point %p with data %p", entryPoint, data);
         return 0;
     }
+
+    QObject::connect(thread, SIGNAL(finished()), ThreadMonitor::instance(), SLOT(threadFinished()));
+
     thread->start();
 
     QThread* threadRef = static_cast<QThread*>(thread);
@@ -162,7 +175,7 @@ ThreadIdentifier createThreadInternal(ThreadFunction entryPoint, void* data, con
     return establishIdentifierForThread(threadRef);
 }
 
-void setThreadNameInternal(const char*)
+void initializeCurrentThreadInternal(const char*)
 {
 }
 
@@ -181,8 +194,10 @@ int waitForThreadCompletion(ThreadIdentifier threadID, void** result)
     return !res;
 }
 
-void detachThread(ThreadIdentifier)
+void detachThread(ThreadIdentifier threadID)
 {
+    ASSERT(threadID);
+    clearThreadForIdentifier(threadID);
 }
 
 ThreadIdentifier currentThread()
@@ -193,9 +208,9 @@ ThreadIdentifier currentThread()
     return establishIdentifierForThread(currentThread);
 }
 
-bool isMainThread()
+void yield()
 {
-    return QThread::currentThread() == QCoreApplication::instance()->thread();
+    QThread::yieldCurrentThread();
 }
 
 Mutex::Mutex()
@@ -267,3 +282,7 @@ void ThreadCondition::broadcast()
 }
 
 } // namespace WebCore
+
+#include "ThreadingQt.moc"
+
+#endif