[SCM] WebKit Debian packaging branch, webkit-1.2, updated. upstream/1.1.90-6072-g9a69373

jorlow at chromium.org jorlow at chromium.org
Wed Apr 7 23:22:38 UTC 2010


The following commit has been merged in the webkit-1.2 branch:
commit 717fd35b1a779273a32c09d2337564d0a9d964c2
Author: jorlow at chromium.org <jorlow at chromium.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Date:   Wed Nov 4 19:35:04 2009 +0000

    Revert 50519 while I work out what went wrong.
    
    Patch by Jeremy Orlow <jorlow at chromium.org> on 2009-11-04
    * storage/LocalStorageThread.cpp:
    (WebCore::LocalStorageThread::create):
    (WebCore::LocalStorageThread::LocalStorageThread):
    (WebCore::LocalStorageThread::start):
    (WebCore::LocalStorageThread::localStorageThreadStart):
    (WebCore::LocalStorageThread::localStorageThread):
    (WebCore::LocalStorageThread::scheduleImport):
    (WebCore::LocalStorageThread::scheduleSync):
    (WebCore::LocalStorageThread::terminate):
    (WebCore::LocalStorageThread::performTerminate):
    * storage/LocalStorageThread.h:
    * storage/StorageSyncManager.cpp:
    (WebCore::StorageSyncManager::StorageSyncManager):
    (WebCore::StorageSyncManager::~StorageSyncManager):
    (WebCore::StorageSyncManager::scheduleImport):
    (WebCore::StorageSyncManager::scheduleSync):
    * storage/StorageSyncManager.h:
    
    
    
    git-svn-id: http://svn.webkit.org/repository/webkit/trunk@50521 268f45cc-cd09-0410-ab3c-d52691b4dbfc

diff --git a/WebCore/ChangeLog b/WebCore/ChangeLog
index bff1e45..c8bde61 100644
--- a/WebCore/ChangeLog
+++ b/WebCore/ChangeLog
@@ -1,3 +1,25 @@
+2009-11-04  Jeremy Orlow  <jorlow at chromium.org>
+
+        Revert 50519 while I work out what went wrong.
+
+        * storage/LocalStorageThread.cpp:
+        (WebCore::LocalStorageThread::create):
+        (WebCore::LocalStorageThread::LocalStorageThread):
+        (WebCore::LocalStorageThread::start):
+        (WebCore::LocalStorageThread::localStorageThreadStart):
+        (WebCore::LocalStorageThread::localStorageThread):
+        (WebCore::LocalStorageThread::scheduleImport):
+        (WebCore::LocalStorageThread::scheduleSync):
+        (WebCore::LocalStorageThread::terminate):
+        (WebCore::LocalStorageThread::performTerminate):
+        * storage/LocalStorageThread.h:
+        * storage/StorageSyncManager.cpp:
+        (WebCore::StorageSyncManager::StorageSyncManager):
+        (WebCore::StorageSyncManager::~StorageSyncManager):
+        (WebCore::StorageSyncManager::scheduleImport):
+        (WebCore::StorageSyncManager::scheduleSync):
+        * storage/StorageSyncManager.h:
+
 2009-11-04  Pavel Feldman  <pfeldman at chromium.org>
 
         Reviewed by Timothy Hatcher.
diff --git a/WebCore/storage/LocalStorageThread.cpp b/WebCore/storage/LocalStorageThread.cpp
index a19ffa8..005156b 100644
--- a/WebCore/storage/LocalStorageThread.cpp
+++ b/WebCore/storage/LocalStorageThread.cpp
@@ -33,70 +33,93 @@
 
 namespace WebCore {
 
-PassOwnPtr<LocalStorageThread> LocalStorageThread::create()
+PassRefPtr<LocalStorageThread> LocalStorageThread::create()
 {
-    return new LocalStorageThread;
+    return adoptRef(new LocalStorageThread);
 }
 
 LocalStorageThread::LocalStorageThread()
     : m_threadID(0)
+    , m_terminated(false)
 {
-}
-
-LocalStorageThread::~LocalStorageThread()
-{
-    ASSERT(isMainThread());
-    ASSERT(!m_threadID);
+    m_selfRef = this;
 }
 
 bool LocalStorageThread::start()
 {
-    ASSERT(isMainThread());
-    if (!m_threadID)
-        m_threadID = createThread(LocalStorageThread::threadEntryPointCallback, this, "WebCore: LocalStorage");
+    MutexLocker lock(m_threadCreationMutex);
+
+    if (m_threadID)
+        return true;
+
+    m_threadID = createThread(LocalStorageThread::localStorageThreadStart, this, "WebCore: LocalStorage");
+
     return m_threadID;
 }
 
-void* LocalStorageThread::threadEntryPointCallback(void* thread)
+void* LocalStorageThread::localStorageThreadStart(void* thread)
 {
-    return static_cast<LocalStorageThread*>(thread)->threadEntryPoint();
+    return static_cast<LocalStorageThread*>(thread)->localStorageThread();
 }
 
-void* LocalStorageThread::threadEntryPoint()
+void* LocalStorageThread::localStorageThread()
 {
-    ASSERT(!isMainThread());
+    {
+        // Wait for LocalStorageThread::start() to complete.
+        MutexLocker lock(m_threadCreationMutex);
+    }
+
     while (OwnPtr<LocalStorageTask> task = m_queue.waitForMessage())
         task->performTask();
 
+    // Detach the thread so its resources are no longer of any concern to anyone else
+    detachThread(m_threadID);
+    m_threadID = 0;
+
+    // Clear the self refptr, possibly resulting in deletion
+    m_selfRef = 0;
+
     return 0;
 }
 
-void LocalStorageThread::scheduleTask(PassRefPtr<LocalStorageTask> task)
+void LocalStorageThread::scheduleImport(StorageAreaSync* area)
+{
+    ASSERT(!m_queue.killed() && m_threadID);
+    m_queue.append(LocalStorageTask::createImport(area));
+}
+
+void LocalStorageThread::scheduleSync(StorageAreaSync* area)
 {
-    ASSERT(isMainThread());
     ASSERT(!m_queue.killed() && m_threadID);
-    m_queue.append(task);
+    m_queue.append(LocalStorageTask::createSync(area));
 }
 
 void LocalStorageThread::terminate()
 {
     ASSERT(isMainThread());
+
+    // Ideally we'd never be killing a thread that wasn't live, so ASSERT it.
+    // But if we do in a release build, make sure to not wait on a condition that will never get signalled
     ASSERT(!m_queue.killed() && m_threadID);
-    // Even in weird, exceptional cases, don't wait on a nonexistent thread to terminate.
     if (!m_threadID)
         return;
 
-    void* returnValue;
     m_queue.append(LocalStorageTask::createTerminate(this));
-    waitForThreadCompletion(m_threadID, &returnValue);
-    ASSERT(m_queue.killed());
-    m_threadID = 0;
+
+    MutexLocker locker(m_terminateLock);
+    while (!m_terminated)
+        m_terminateCondition.wait(m_terminateLock);
 }
 
 void LocalStorageThread::performTerminate()
 {
     ASSERT(!isMainThread());
+
     m_queue.kill();
+
+    MutexLocker locker(m_terminateLock);
+    m_terminated = true;
+    m_terminateCondition.signal();
 }
 
 }
diff --git a/WebCore/storage/LocalStorageThread.h b/WebCore/storage/LocalStorageThread.h
index 6989ce6..616b809 100644
--- a/WebCore/storage/LocalStorageThread.h
+++ b/WebCore/storage/LocalStorageThread.h
@@ -30,7 +30,6 @@
 
 #include <wtf/HashSet.h>
 #include <wtf/MessageQueue.h>
-#include <wtf/PassOwnPtr.h>
 #include <wtf/PassRefPtr.h>
 #include <wtf/Threading.h>
 
@@ -40,27 +39,35 @@ namespace WebCore {
     class LocalStorageTask;
 
     // FIXME: Rename this class to StorageThread
-    class LocalStorageThread : public Noncopyable {
+    class LocalStorageThread : public ThreadSafeShared<LocalStorageThread> {
     public:
-        static PassOwnPtr<LocalStorageThread> create();
-        ~LocalStorageThread();
+        static PassRefPtr<LocalStorageThread> create();
 
         bool start();
-        void terminate();
-        void scheduleTask(PassRefPtr<LocalStorageTask>);
 
-        // Background thread part of the terminate procedure.
+        void scheduleImport(StorageAreaSync*);
+        void scheduleSync(StorageAreaSync*);
+
+        // Called from the main thread to synchronously shut down this thread
+        void terminate();
+        // Background thread part of the terminate procedure
         void performTerminate();
 
     private:
         LocalStorageThread();
 
-        // Called on background thread.
-        static void* threadEntryPointCallback(void*);
-        void* threadEntryPoint();
+        static void* localStorageThreadStart(void*);
+        void* localStorageThread();
 
+        Mutex m_threadCreationMutex;
         ThreadIdentifier m_threadID;
+        RefPtr<LocalStorageThread> m_selfRef;
+
         MessageQueue<LocalStorageTask> m_queue;
+
+        Mutex m_terminateLock;
+        ThreadCondition m_terminateCondition;
+        bool m_terminated;
     };
 
 } // namespace WebCore
diff --git a/WebCore/storage/StorageSyncManager.cpp b/WebCore/storage/StorageSyncManager.cpp
index f7e41e9..f9276dd 100644
--- a/WebCore/storage/StorageSyncManager.cpp
+++ b/WebCore/storage/StorageSyncManager.cpp
@@ -48,21 +48,19 @@ PassRefPtr<StorageSyncManager> StorageSyncManager::create(const String& path)
 }
 
 StorageSyncManager::StorageSyncManager(const String& path)
-    : m_thread(LocalStorageThread::create())
-    , m_path(path.crossThreadString())
+    : m_path(path.crossThreadString())
 {
     ASSERT(isMainThread());
     ASSERT(!m_path.isEmpty());
+    m_thread = LocalStorageThread::create();
     m_thread->start();
 }
 
 StorageSyncManager::~StorageSyncManager()
 {
     ASSERT(isMainThread());
-    ASSERT(!m_thread);
 }
 
-// Called on a background thread.
 String StorageSyncManager::fullDatabaseFilename(SecurityOrigin* origin)
 {
     ASSERT(origin);
@@ -87,18 +85,19 @@ void StorageSyncManager::close()
 bool StorageSyncManager::scheduleImport(PassRefPtr<StorageAreaSync> area)
 {
     ASSERT(isMainThread());
-    ASSERT(m_thread);
+
     if (m_thread)
-        m_thread->scheduleTask(LocalStorageTask::createImport(area.get()));
+        m_thread->scheduleImport(area.get());
+
     return m_thread;
 }
 
 void StorageSyncManager::scheduleSync(PassRefPtr<StorageAreaSync> area)
 {
     ASSERT(isMainThread());
-    ASSERT(m_thread);
+
     if (m_thread)
-        m_thread->scheduleTask(LocalStorageTask::createSync(area.get()));
+        m_thread->scheduleSync(area.get());
 }
 
 } // namespace WebCore
diff --git a/WebCore/storage/StorageSyncManager.h b/WebCore/storage/StorageSyncManager.h
index 6ee767a..fe35e3d 100644
--- a/WebCore/storage/StorageSyncManager.h
+++ b/WebCore/storage/StorageSyncManager.h
@@ -32,7 +32,7 @@
 
 #include <wtf/PassRefPtr.h>
 #include <wtf/RefCounted.h>
-#include <wtf/OwnPtr.h>
+#include <wtf/RefPtr.h>
 
 namespace WebCore {
 
@@ -53,7 +53,7 @@ namespace WebCore {
     private:
         StorageSyncManager(const String& path);
 
-        OwnPtr<LocalStorageThread> m_thread;
+        RefPtr<LocalStorageThread> m_thread;
 
     // The following members are subject to thread synchronization issues
     public:

-- 
WebKit Debian packaging



More information about the Pkg-webkit-commits mailing list