2007-11-11 Justin Haygood <jhaygood@reaktix.com>
authormrowe@apple.com <mrowe@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 12 Nov 2007 05:54:59 +0000 (05:54 +0000)
committermrowe@apple.com <mrowe@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 12 Nov 2007 05:54:59 +0000 (05:54 +0000)
        Reviewed by Adam Roben.

        http://bugs.webkit.org/show_bug.cgi?id=15939
        Adds a currentThread API for use by SQLiteDatabase, etc.

        * platform/Threading.h:
        * platform/ThreadingNone.cpp:
        (WebCore::currentThread):
        * platform/gtk/ThreadingGtk.cpp:
        (WebCore::identifierByGthreadHandle):
        (WebCore::):
        * platform/pthreads/ThreadingPthreads.cpp:
        (WebCore::identifierByPthreadHandle):
        (WebCore::currentThread):

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

WebCore/ChangeLog
WebCore/platform/Threading.h
WebCore/platform/ThreadingNone.cpp
WebCore/platform/gtk/ThreadingGtk.cpp
WebCore/platform/pthreads/ThreadingPthreads.cpp

index 72c10c84fcab99d0ad26def2ee0a35099a0ec957..9786619b582b5f42f00195a2aeefae760f4907e5 100644 (file)
@@ -1,3 +1,20 @@
+2007-11-11  Justin Haygood  <jhaygood@reaktix.com>
+
+        Reviewed by Adam Roben.
+
+        http://bugs.webkit.org/show_bug.cgi?id=15939
+        Adds a currentThread API for use by SQLiteDatabase, etc.
+
+        * platform/Threading.h:
+        * platform/ThreadingNone.cpp:
+        (WebCore::currentThread):
+        * platform/gtk/ThreadingGtk.cpp:
+        (WebCore::identifierByGthreadHandle):
+        (WebCore::):
+        * platform/pthreads/ThreadingPthreads.cpp:
+        (WebCore::identifierByPthreadHandle):
+        (WebCore::currentThread):
+
 2007-11-11  Dan Bernstein  <mitz@apple.com>
 
         Reviewed by Adam Roben.
index da5848b5db66a1ef3163c350eb4da24dd8acfb5d..534e3f6773755a75b10b849d82e21851dd17f8a6 100644 (file)
@@ -1,5 +1,6 @@
 /*
  * Copyright (C) 2007 Apple Inc. All rights reserved.
+ * Copyright (C) 2007 Justin Haygood (jhaygood@reaktix.com)
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -41,6 +42,11 @@ typedef struct _GMutex GMutex;
 typedef struct _GCond GCond;
 #endif
 
+#if PLATFORM(QT)
+class QMutex;
+class QWaitCondition;
+#endif
+
 #include <stdint.h>
 
 namespace WebCore {
@@ -50,6 +56,7 @@ typedef void* (*ThreadFunction)(void* argument);
 
 // Returns 0 if thread creation failed
 ThreadIdentifier createThread(ThreadFunction, void*);
+ThreadIdentifier currentThread();
 int waitForThreadCompletion(ThreadIdentifier, void**);
 void detachThread(ThreadIdentifier);
 
@@ -59,6 +66,9 @@ typedef pthread_cond_t PlatformCondition;
 #elif PLATFORM(GTK)
 typedef GMutex* PlatformMutex;
 typedef GCond* PlatformCondition;
+#elif PLATFORM(QT)
+typedef QMutex* PlatformMutex;
+typedef QWaitCondition* PlatformCondition;
 #else
 typedef void* PlatformMutex;
 typedef void* PlatformCondition;
index 332a57107a6f2b31f373c6c619abaa203d373d53..10ba8d7eca4334ca4adaeb1b3fd174a58698281c 100644 (file)
@@ -1,5 +1,6 @@
 /*
  * Copyright (C) 2007 Apple Inc. All rights reserved.
+ * Copyright (C) 2007 Justin Haygood (jhaygood@reaktix.com)
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -33,6 +34,7 @@ namespace WebCore {
 ThreadIdentifier createThread(ThreadFunction, void*) { return 0; }
 int waitForThreadCompletion(ThreadIdentifier, void**) { return 0; }
 void detachThread(ThreadIdentifier) { }
+ThreadIdentifier currentThread() { return 0; }
 
 Mutex::Mutex() {}
 Mutex::~Mutex() {}
index a0f6d7a17e95ef07e6822403c4ad8cb8b9babd89..9fc775b41187fec6d4c56f22c4139f812fbab99a 100644 (file)
@@ -1,5 +1,6 @@
 /*
  * Copyright (C) 2007 Apple Inc. All rights reserved.
+ * Copyright (C) 2007 Justin Haygood (jhaygood@reaktix.com)
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -79,6 +80,19 @@ static ThreadIdentifier establishIdentifierForThread(GThread*& thread)
     return identifierCount++;
 }
 
+static ThreadIdentifier identifierByGthreadHandle(GThread*& thread)
+{
+    MutexLocker locker(threadMapMutex());
+
+    HashMap<ThreadIdentifier, GThread*>::iterator i = threadMap().begin();
+    for (; i != threadMap().end(); ++i) {
+        if (i->second == thread)
+            return i->first;
+    }
+
+    return 0;
+}
+
 static GThread* threadForIdentifier(ThreadIdentifier id)
 {
     MutexLocker locker(threadMapMutex());
@@ -124,6 +138,14 @@ void detachThread(ThreadIdentifier)
 {
 }
 
+ThreadIdentifier currentThread()
+{
+    GThread* currentThread = g_thread_self();
+    if (ThreadIdentifier id = identifierByGthreadHandle(currentThread))
+        return id;
+    return establishIdentifierForThread(currentThread);
+}
+
 Mutex::Mutex()
     : m_mutex(g_mutex_new())
 {
index d6d5f777d561d3869f5e46719b892e2dabdaa779..c12fd924f2e51411420727a7df540c69f1478c32 100644 (file)
@@ -1,5 +1,6 @@
 /*
  * Copyright (C) 2007 Apple Inc. All rights reserved.
+ * Copyright (C) 2007 Justin Haygood (jhaygood@reaktix.com)
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -58,6 +59,19 @@ static ThreadIdentifier establishIdentifierForPthreadHandle(pthread_t& pthreadHa
     return identifierCount++;
 }
 
+static ThreadIdentifier identifierByPthreadHandle(const pthread_t& pthreadHandle)
+{
+    MutexLocker locker(threadMapMutex());
+
+    HashMap<ThreadIdentifier, pthread_t>::iterator i = threadMap().begin();
+    for (; i != threadMap().end(); ++i) {
+        if (pthread_equal(i->second, pthreadHandle))
+            return i->first;
+    }
+
+    return 0;
+}
+
 static pthread_t pthreadHandleForIdentifier(ThreadIdentifier id)
 {
     MutexLocker locker(threadMapMutex());
@@ -112,6 +126,14 @@ void detachThread(ThreadIdentifier threadID)
     clearPthreadHandleForIdentifier(threadID);
 }
 
+ThreadIdentifier currentThread()
+{
+    pthread_t currentThread = pthread_self();
+    if (ThreadIdentifier id = identifierByPthreadHandle(currentThread))
+        return id;
+    return establishIdentifierForPthreadHandle(currentThread);
+}
+
 Mutex::Mutex()
 {
     pthread_mutex_init(&m_mutex, NULL);