[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