[SCM] WebKit Debian packaging branch, webkit-1.1, updated. upstream/1.1.16-1409-g5afdf4d
jorlow at chromium.org
jorlow at chromium.org
Thu Dec 3 13:26:59 UTC 2009
The following commit has been merged in the webkit-1.1 branch:
commit a3fccac358bd4bcb82b41f4484a785bbc27a58f8
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