[SCM] WebKit Debian packaging branch, debian/experimental, updated. upstream/1.3.3-9427-gc2be6fc
dumi at chromium.org
dumi at chromium.org
Wed Dec 22 11:54:04 UTC 2010
The following commit has been merged in the debian/experimental branch:
commit fb69dd33c5a62c3eb64f01dbe3c7755f0aba80a6
Author: dumi at chromium.org <dumi at chromium.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Date: Wed Aug 11 01:19:23 2010 +0000
Do not post a sync task to the DB thread if it's terminating.
https://bugs.webkit.org/show_bug.cgi?id=43676
Reviewed by David Levin.
* bindings/generic/ActiveDOMCallback.cpp: The context can
sometimes be NULL. Check if it's NULL instead of asserting that
it's not.
(WebCore::ActiveDOMCallback::ActiveDOMCallback):
* dom/ActiveDOMObject.cpp:
(WebCore::ActiveDOMObject::ActiveDOMObject):
* storage/Database.cpp: Do not post a sync task to the DB thread
if the DB thread is terminating. Also, when a task is destroyed,
ASSERT that it was completed, or that it had no synchronizer.
(WebCore::Database::openAndVerifyVersion):
(WebCore::Database::markAsDeletedAndClose):
(WebCore::Database::tableNames):
* storage/DatabaseTask.cpp:
(WebCore::DatabaseTaskSynchronizer::DatabaseTaskSynchronizer):
(WebCore::DatabaseTask::~DatabaseTask):
(WebCore::DatabaseTask::performTask):
* storage/DatabaseTask.h:
(WebCore::DatabaseTaskSynchronizer::hasCheckedForTermination):
(WebCore::DatabaseTaskSynchronizer::setHasCheckedForTermination):
(WebCore::DatabaseTask::hasSynchronizer):
(WebCore::DatabaseTask::hasCheckedForTermination):
* storage/DatabaseThread.cpp:
(WebCore::DatabaseThread::terminationRequested):
(WebCore::DatabaseThread::scheduleTask):
(WebCore::DatabaseThread::scheduleImmediateTask):
* storage/DatabaseThread.h:
git-svn-id: http://svn.webkit.org/repository/webkit/trunk@65108 268f45cc-cd09-0410-ab3c-d52691b4dbfc
diff --git a/JavaScriptCore/bytecode/CodeBlock.h b/JavaScriptCore/bytecode/CodeBlock.h
index be12254..eb4d5c1 100644
--- a/JavaScriptCore/bytecode/CodeBlock.h
+++ b/JavaScriptCore/bytecode/CodeBlock.h
@@ -257,7 +257,7 @@ namespace JSC {
// If we reach this point we've chopped down to one element, no need to check it matches
ASSERT(size == 1);
- ASSERT(key == valueAtPosition(&array[0]));
+ //ASSERT(key == valueAtPosition(&array[0]));
return &array[0];
}
#endif
diff --git a/WebCore/ChangeLog b/WebCore/ChangeLog
index 47cac30..011c897 100644
--- a/WebCore/ChangeLog
+++ b/WebCore/ChangeLog
@@ -1,3 +1,38 @@
+2010-08-10 Dumitru Daniliuc <dumi at chromium.org>
+
+ Reviewed by David Levin.
+
+ Do not post a sync task to the DB thread if it's terminating.
+ https://bugs.webkit.org/show_bug.cgi?id=43676
+
+ * bindings/generic/ActiveDOMCallback.cpp: The context can
+ sometimes be NULL. Check if it's NULL instead of asserting that
+ it's not.
+ (WebCore::ActiveDOMCallback::ActiveDOMCallback):
+ * dom/ActiveDOMObject.cpp:
+ (WebCore::ActiveDOMObject::ActiveDOMObject):
+
+ * storage/Database.cpp: Do not post a sync task to the DB thread
+ if the DB thread is terminating. Also, when a task is destroyed,
+ ASSERT that it was completed, or that it had no synchronizer.
+ (WebCore::Database::openAndVerifyVersion):
+ (WebCore::Database::markAsDeletedAndClose):
+ (WebCore::Database::tableNames):
+ * storage/DatabaseTask.cpp:
+ (WebCore::DatabaseTaskSynchronizer::DatabaseTaskSynchronizer):
+ (WebCore::DatabaseTask::~DatabaseTask):
+ (WebCore::DatabaseTask::performTask):
+ * storage/DatabaseTask.h:
+ (WebCore::DatabaseTaskSynchronizer::hasCheckedForTermination):
+ (WebCore::DatabaseTaskSynchronizer::setHasCheckedForTermination):
+ (WebCore::DatabaseTask::hasSynchronizer):
+ (WebCore::DatabaseTask::hasCheckedForTermination):
+ * storage/DatabaseThread.cpp:
+ (WebCore::DatabaseThread::terminationRequested):
+ (WebCore::DatabaseThread::scheduleTask):
+ (WebCore::DatabaseThread::scheduleImmediateTask):
+ * storage/DatabaseThread.h:
+
2010-08-10 Gavin Barraclough <barraclough at apple.com>
Qt build fix.
diff --git a/WebCore/bindings/generic/ActiveDOMCallback.cpp b/WebCore/bindings/generic/ActiveDOMCallback.cpp
index 2e69d10..c42c93a 100644
--- a/WebCore/bindings/generic/ActiveDOMCallback.cpp
+++ b/WebCore/bindings/generic/ActiveDOMCallback.cpp
@@ -123,7 +123,6 @@ static void destroyOnContextThread(PassOwnPtr<ActiveDOMObjectCallbackImpl> impl)
ActiveDOMCallback::ActiveDOMCallback(ScriptExecutionContext* context)
: m_impl(new ActiveDOMObjectCallbackImpl(context))
{
- ASSERT(context->isContextThread());
}
ActiveDOMCallback::~ActiveDOMCallback()
diff --git a/WebCore/dom/ActiveDOMObject.cpp b/WebCore/dom/ActiveDOMObject.cpp
index 31afe98..98c9761 100644
--- a/WebCore/dom/ActiveDOMObject.cpp
+++ b/WebCore/dom/ActiveDOMObject.cpp
@@ -37,8 +37,10 @@ ActiveDOMObject::ActiveDOMObject(ScriptExecutionContext* scriptExecutionContext,
: m_scriptExecutionContext(scriptExecutionContext)
, m_pendingActivityCount(0)
{
- ASSERT(m_scriptExecutionContext->isContextThread());
- m_scriptExecutionContext->createdActiveDOMObject(this, upcastPointer);
+ if (m_scriptExecutionContext) {
+ ASSERT(m_scriptExecutionContext->isContextThread());
+ m_scriptExecutionContext->createdActiveDOMObject(this, upcastPointer);
+ }
}
ActiveDOMObject::~ActiveDOMObject()
diff --git a/WebCore/storage/Database.cpp b/WebCore/storage/Database.cpp
index 9550083..961310d 100644
--- a/WebCore/storage/Database.cpp
+++ b/WebCore/storage/Database.cpp
@@ -183,13 +183,12 @@ String Database::version() const
bool Database::openAndVerifyVersion(bool setVersionInNewDatabase, ExceptionCode& e)
{
- if (!m_scriptExecutionContext->databaseThread())
+ DatabaseTaskSynchronizer synchronizer;
+ if (!m_scriptExecutionContext->databaseThread() || m_scriptExecutionContext->databaseThread()->terminationRequested(&synchronizer))
return false;
bool success = false;
- DatabaseTaskSynchronizer synchronizer;
OwnPtr<DatabaseOpenTask> task = DatabaseOpenTask::create(this, setVersionInNewDatabase, &synchronizer, e, success);
-
m_scriptExecutionContext->databaseThread()->scheduleImmediateTask(task.release());
synchronizer.waitForTaskCompletion();
@@ -204,14 +203,13 @@ void Database::markAsDeletedAndClose()
LOG(StorageAPI, "Marking %s (%p) as deleted", stringIdentifier().ascii().data(), this);
m_deleted = true;
- if (m_scriptExecutionContext->databaseThread()->terminationRequested()) {
+ DatabaseTaskSynchronizer synchronizer;
+ if (m_scriptExecutionContext->databaseThread()->terminationRequested(&synchronizer)) {
LOG(StorageAPI, "Database handle %p is on a terminated DatabaseThread, cannot be marked for normal closure\n", this);
return;
}
- DatabaseTaskSynchronizer synchronizer;
OwnPtr<DatabaseCloseTask> task = DatabaseCloseTask::create(this, &synchronizer);
-
m_scriptExecutionContext->databaseThread()->scheduleImmediateTask(task.release());
synchronizer.waitForTaskCompletion();
}
@@ -397,12 +395,11 @@ Vector<String> Database::tableNames()
// FIXME: Not using threadsafeCopy on these strings looks ok since threads take strict turns
// in dealing with them. However, if the code changes, this may not be true anymore.
Vector<String> result;
- if (!m_scriptExecutionContext->databaseThread())
+ DatabaseTaskSynchronizer synchronizer;
+ if (!m_scriptExecutionContext->databaseThread() || m_scriptExecutionContext->databaseThread()->terminationRequested(&synchronizer))
return result;
- DatabaseTaskSynchronizer synchronizer;
OwnPtr<DatabaseTableNamesTask> task = DatabaseTableNamesTask::create(this, &synchronizer, result);
-
m_scriptExecutionContext->databaseThread()->scheduleImmediateTask(task.release());
synchronizer.waitForTaskCompletion();
diff --git a/WebCore/storage/DatabaseTask.cpp b/WebCore/storage/DatabaseTask.cpp
index 3526d9d..343ae1e 100644
--- a/WebCore/storage/DatabaseTask.cpp
+++ b/WebCore/storage/DatabaseTask.cpp
@@ -37,6 +37,9 @@ namespace WebCore {
DatabaseTaskSynchronizer::DatabaseTaskSynchronizer()
: m_taskCompleted(false)
+#ifndef NDEBUG
+ , m_hasCheckedForTermination(false)
+#endif
{
}
@@ -67,6 +70,7 @@ DatabaseTask::DatabaseTask(Database* database, DatabaseTaskSynchronizer* synchro
DatabaseTask::~DatabaseTask()
{
+ ASSERT(m_complete || !m_synchronizer);
}
void DatabaseTask::performTask()
@@ -81,6 +85,10 @@ void DatabaseTask::performTask()
if (m_synchronizer)
m_synchronizer->taskCompleted();
+
+#ifndef NDEBUG
+ m_complete = true;
+#endif
}
// *** DatabaseOpenTask ***
diff --git a/WebCore/storage/DatabaseTask.h b/WebCore/storage/DatabaseTask.h
index 9673a26..847846d 100644
--- a/WebCore/storage/DatabaseTask.h
+++ b/WebCore/storage/DatabaseTask.h
@@ -52,11 +52,19 @@ public:
// Called by the task.
void taskCompleted();
-private:
+#ifndef NDEBUG
+ bool hasCheckedForTermination() const { return m_hasCheckedForTermination; }
+ void setHasCheckedForTermination() { m_hasCheckedForTermination = true; }
+#endif
+
+private:
bool m_taskCompleted;
Mutex m_synchronousMutex;
ThreadCondition m_synchronousCondition;
+#ifndef NDEBUG
+ bool m_hasCheckedForTermination;
+#endif
};
class DatabaseTask : public Noncopyable {
@@ -66,6 +74,10 @@ public:
void performTask();
Database* database() const { return m_database; }
+#ifndef NDEBUG
+ bool hasSynchronizer() const { return m_synchronizer; }
+ bool hasCheckedForTermination() const { return m_synchronizer->hasCheckedForTermination(); }
+#endif
protected:
DatabaseTask(Database*, DatabaseTaskSynchronizer*);
@@ -77,8 +89,8 @@ private:
DatabaseTaskSynchronizer* m_synchronizer;
#ifndef NDEBUG
- virtual const char* debugTaskName() const = 0;
- bool m_complete;
+ virtual const char* debugTaskName() const = 0;
+ bool m_complete;
#endif
};
diff --git a/WebCore/storage/DatabaseThread.cpp b/WebCore/storage/DatabaseThread.cpp
index ae2a6c0..99cf3b9 100644
--- a/WebCore/storage/DatabaseThread.cpp
+++ b/WebCore/storage/DatabaseThread.cpp
@@ -37,6 +37,7 @@
#include "Logging.h"
#include "SQLTransactionClient.h"
#include "SQLTransactionCoordinator.h"
+#include <wtf/UnusedParam.h>
namespace WebCore {
@@ -75,8 +76,15 @@ void DatabaseThread::requestTermination(DatabaseTaskSynchronizer *cleanupSync)
m_queue.kill();
}
-bool DatabaseThread::terminationRequested() const
+bool DatabaseThread::terminationRequested(DatabaseTaskSynchronizer* taskSynchronizer) const
{
+#ifndef NDEBUG
+ if (taskSynchronizer)
+ taskSynchronizer->setHasCheckedForTermination();
+#else
+ UNUSED_PARAM(taskSynchronizer);
+#endif
+
return m_queue.killed();
}
@@ -148,11 +156,13 @@ void DatabaseThread::recordDatabaseClosed(Database* database)
void DatabaseThread::scheduleTask(PassOwnPtr<DatabaseTask> task)
{
+ ASSERT(!task->hasSynchronizer() || task->hasCheckedForTermination());
m_queue.append(task);
}
void DatabaseThread::scheduleImmediateTask(PassOwnPtr<DatabaseTask> task)
{
+ ASSERT(!task->hasSynchronizer() || task->hasCheckedForTermination());
m_queue.prepend(task);
}
diff --git a/WebCore/storage/DatabaseThread.h b/WebCore/storage/DatabaseThread.h
index 3702619..c81e376 100644
--- a/WebCore/storage/DatabaseThread.h
+++ b/WebCore/storage/DatabaseThread.h
@@ -55,7 +55,7 @@ public:
bool start();
void requestTermination(DatabaseTaskSynchronizer* cleanupSync);
- bool terminationRequested() const;
+ bool terminationRequested(DatabaseTaskSynchronizer* taskSynchronizer = 0) const;
void scheduleTask(PassOwnPtr<DatabaseTask>);
void scheduleImmediateTask(PassOwnPtr<DatabaseTask>); // This just adds the task to the front of the queue - the caller needs to be extremely careful not to create deadlocks when waiting for completion.
--
WebKit Debian packaging
More information about the Pkg-webkit-commits
mailing list