Commit dad06c73 authored by haraken@chromium.org's avatar haraken@chromium.org

Rename DatabaseTaskSynchronizer to TaskSynchronizer and move it to platform/

- We want to use DatabaseTaskSynchronizer in the HTML parser thread in a follow-up CL. In preparation for that, this CL renames DatabaseTaskSynchronizer to TaskSynchronizer and moves it to platform/.

BUG=340522
R=ager@chromium.org, tkent@chromium.org, wibling@chromium.org

Committed: https://src.chromium.org/viewvc/blink?view=rev&revision=170532

Review URL: https://codereview.chromium.org/198673002

git-svn-id: svn://svn.chromium.org/blink/trunk@170536 bbb929c8-8fbe-4397-9dbb-9b2b20218538
parent 1b7e5bff
...@@ -219,7 +219,7 @@ Vector<String> Database::tableNames() ...@@ -219,7 +219,7 @@ Vector<String> Database::tableNames()
// FIXME: Not using isolatedCopy on these strings looks ok since threads take strict turns // FIXME: Not using isolatedCopy 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. // in dealing with them. However, if the code changes, this may not be true anymore.
Vector<String> result; Vector<String> result;
DatabaseTaskSynchronizer synchronizer; TaskSynchronizer synchronizer;
if (!databaseContext()->databaseThread() || databaseContext()->databaseThread()->terminationRequested(&synchronizer)) if (!databaseContext()->databaseThread() || databaseContext()->databaseThread()->terminationRequested(&synchronizer))
return result; return result;
......
...@@ -55,7 +55,7 @@ void DatabaseBackend::trace(Visitor* visitor) ...@@ -55,7 +55,7 @@ void DatabaseBackend::trace(Visitor* visitor)
bool DatabaseBackend::openAndVerifyVersion(bool setVersionInNewDatabase, DatabaseError& error, String& errorMessage) bool DatabaseBackend::openAndVerifyVersion(bool setVersionInNewDatabase, DatabaseError& error, String& errorMessage)
{ {
DatabaseTaskSynchronizer synchronizer; TaskSynchronizer synchronizer;
if (!databaseContext()->databaseThread() || databaseContext()->databaseThread()->terminationRequested(&synchronizer)) if (!databaseContext()->databaseThread() || databaseContext()->databaseThread()->terminationRequested(&synchronizer))
return false; return false;
......
...@@ -239,7 +239,7 @@ void DatabaseContext::stopDatabases() ...@@ -239,7 +239,7 @@ void DatabaseContext::stopDatabases()
// DatabaseThread. // DatabaseThread.
if (m_databaseThread && !m_hasRequestedTermination) { if (m_databaseThread && !m_hasRequestedTermination) {
DatabaseTaskSynchronizer sync; TaskSynchronizer sync;
m_databaseThread->requestTermination(&sync); m_databaseThread->requestTermination(&sync);
m_hasRequestedTermination = true; m_hasRequestedTermination = true;
sync.waitForTaskCompletion(); sync.waitForTaskCompletion();
......
...@@ -38,7 +38,7 @@ namespace WebCore { ...@@ -38,7 +38,7 @@ namespace WebCore {
class Database; class Database;
class DatabaseBackendBase; class DatabaseBackendBase;
class DatabaseContext; class DatabaseContext;
class DatabaseTaskSynchronizer; class TaskSynchronizer;
class DatabaseThread; class DatabaseThread;
class ExecutionContext; class ExecutionContext;
class SecurityOrigin; class SecurityOrigin;
......
...@@ -43,7 +43,7 @@ class DatabaseBackendBase; ...@@ -43,7 +43,7 @@ class DatabaseBackendBase;
class DatabaseCallback; class DatabaseCallback;
class DatabaseContext; class DatabaseContext;
class DatabaseSync; class DatabaseSync;
class DatabaseTaskSynchronizer; class TaskSynchronizer;
class ExceptionState; class ExceptionState;
class SecurityOrigin; class SecurityOrigin;
class ExecutionContext; class ExecutionContext;
......
...@@ -25,6 +25,7 @@ ...@@ -25,6 +25,7 @@
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/ */
#include "config.h" #include "config.h"
#include "modules/webdatabase/DatabaseTask.h" #include "modules/webdatabase/DatabaseTask.h"
...@@ -35,34 +36,7 @@ ...@@ -35,34 +36,7 @@
namespace WebCore { namespace WebCore {
DatabaseTaskSynchronizer::DatabaseTaskSynchronizer() DatabaseTask::DatabaseTask(DatabaseBackend* database, TaskSynchronizer* synchronizer)
: m_taskCompleted(false)
#ifndef NDEBUG
, m_hasCheckedForTermination(false)
#endif
{
}
void DatabaseTaskSynchronizer::waitForTaskCompletion()
{
// Prevent the deadlock between park request by other threads and blocking
// by m_synchronousCondition.
ThreadState::SafePointScope scope(ThreadState::HeapPointersOnStack);
m_synchronousMutex.lock();
while (!m_taskCompleted)
m_synchronousCondition.wait(m_synchronousMutex);
m_synchronousMutex.unlock();
}
void DatabaseTaskSynchronizer::taskCompleted()
{
m_synchronousMutex.lock();
m_taskCompleted = true;
m_synchronousCondition.signal();
m_synchronousMutex.unlock();
}
DatabaseTask::DatabaseTask(DatabaseBackend* database, DatabaseTaskSynchronizer* synchronizer)
: m_database(database) : m_database(database)
, m_synchronizer(synchronizer) , m_synchronizer(synchronizer)
#if !LOG_DISABLED #if !LOG_DISABLED
...@@ -109,7 +83,7 @@ void DatabaseTask::run() ...@@ -109,7 +83,7 @@ void DatabaseTask::run()
// *** DatabaseOpenTask *** // *** DatabaseOpenTask ***
// Opens the database file and verifies the version matches the expected version. // Opens the database file and verifies the version matches the expected version.
DatabaseBackend::DatabaseOpenTask::DatabaseOpenTask(DatabaseBackend* database, bool setVersionInNewDatabase, DatabaseTaskSynchronizer* synchronizer, DatabaseError& error, String& errorMessage, bool& success) DatabaseBackend::DatabaseOpenTask::DatabaseOpenTask(DatabaseBackend* database, bool setVersionInNewDatabase, TaskSynchronizer* synchronizer, DatabaseError& error, String& errorMessage, bool& success)
: DatabaseTask(database, synchronizer) : DatabaseTask(database, synchronizer)
, m_setVersionInNewDatabase(setVersionInNewDatabase) , m_setVersionInNewDatabase(setVersionInNewDatabase)
, m_error(error) , m_error(error)
...@@ -137,7 +111,7 @@ const char* DatabaseBackend::DatabaseOpenTask::debugTaskName() const ...@@ -137,7 +111,7 @@ const char* DatabaseBackend::DatabaseOpenTask::debugTaskName() const
// *** DatabaseCloseTask *** // *** DatabaseCloseTask ***
// Closes the database. // Closes the database.
DatabaseBackend::DatabaseCloseTask::DatabaseCloseTask(DatabaseBackend* database, DatabaseTaskSynchronizer* synchronizer) DatabaseBackend::DatabaseCloseTask::DatabaseCloseTask(DatabaseBackend* database, TaskSynchronizer* synchronizer)
: DatabaseTask(database, synchronizer) : DatabaseTask(database, synchronizer)
{ {
} }
...@@ -195,7 +169,7 @@ const char* DatabaseBackend::DatabaseTransactionTask::debugTaskName() const ...@@ -195,7 +169,7 @@ const char* DatabaseBackend::DatabaseTransactionTask::debugTaskName() const
// *** DatabaseTableNamesTask *** // *** DatabaseTableNamesTask ***
// Retrieves a list of all tables in the database - for WebInspector support. // Retrieves a list of all tables in the database - for WebInspector support.
DatabaseBackend::DatabaseTableNamesTask::DatabaseTableNamesTask(DatabaseBackend* database, DatabaseTaskSynchronizer* synchronizer, Vector<String>& names) DatabaseBackend::DatabaseTableNamesTask::DatabaseTableNamesTask(DatabaseBackend* database, TaskSynchronizer* synchronizer, Vector<String>& names)
: DatabaseTask(database, synchronizer) : DatabaseTask(database, synchronizer)
, m_tableNames(names) , m_tableNames(names)
{ {
......
...@@ -25,6 +25,7 @@ ...@@ -25,6 +25,7 @@
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/ */
#ifndef DatabaseTask_h #ifndef DatabaseTask_h
#define DatabaseTask_h #define DatabaseTask_h
...@@ -34,6 +35,7 @@ ...@@ -34,6 +35,7 @@
#include "modules/webdatabase/DatabaseError.h" #include "modules/webdatabase/DatabaseError.h"
#include "modules/webdatabase/SQLTransactionBackend.h" #include "modules/webdatabase/SQLTransactionBackend.h"
#include "platform/Task.h" #include "platform/Task.h"
#include "platform/TaskSynchronizer.h"
#include "wtf/OwnPtr.h" #include "wtf/OwnPtr.h"
#include "wtf/PassOwnPtr.h" #include "wtf/PassOwnPtr.h"
#include "wtf/PassRefPtr.h" #include "wtf/PassRefPtr.h"
...@@ -44,33 +46,6 @@ ...@@ -44,33 +46,6 @@
namespace WebCore { namespace WebCore {
// Can be used to wait until DatabaseTask is completed.
// Has to be passed into DatabaseTask::create to be associated with the task.
class DatabaseTaskSynchronizer {
WTF_MAKE_NONCOPYABLE(DatabaseTaskSynchronizer);
public:
DatabaseTaskSynchronizer();
// Called from main thread to wait until task is completed.
void waitForTaskCompletion();
// Called by the task.
void taskCompleted();
#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 blink::WebThread::Task { class DatabaseTask : public blink::WebThread::Task {
WTF_MAKE_NONCOPYABLE(DatabaseTask); WTF_MAKE_FAST_ALLOCATED; WTF_MAKE_NONCOPYABLE(DatabaseTask); WTF_MAKE_FAST_ALLOCATED;
public: public:
...@@ -85,14 +60,14 @@ public: ...@@ -85,14 +60,14 @@ public:
#endif #endif
protected: protected:
DatabaseTask(DatabaseBackend*, DatabaseTaskSynchronizer*); DatabaseTask(DatabaseBackend*, TaskSynchronizer*);
private: private:
virtual void doPerformTask() = 0; virtual void doPerformTask() = 0;
virtual void taskCancelled() { } virtual void taskCancelled() { }
RefPtrWillBeCrossThreadPersistent<DatabaseBackend> m_database; RefPtrWillBeCrossThreadPersistent<DatabaseBackend> m_database;
DatabaseTaskSynchronizer* m_synchronizer; TaskSynchronizer* m_synchronizer;
#if !LOG_DISABLED #if !LOG_DISABLED
virtual const char* debugTaskName() const = 0; virtual const char* debugTaskName() const = 0;
...@@ -102,13 +77,13 @@ private: ...@@ -102,13 +77,13 @@ private:
class DatabaseBackend::DatabaseOpenTask FINAL : public DatabaseTask { class DatabaseBackend::DatabaseOpenTask FINAL : public DatabaseTask {
public: public:
static PassOwnPtr<DatabaseOpenTask> create(DatabaseBackend* db, bool setVersionInNewDatabase, DatabaseTaskSynchronizer* synchronizer, DatabaseError& error, String& errorMessage, bool& success) static PassOwnPtr<DatabaseOpenTask> create(DatabaseBackend* db, bool setVersionInNewDatabase, TaskSynchronizer* synchronizer, DatabaseError& error, String& errorMessage, bool& success)
{ {
return adoptPtr(new DatabaseOpenTask(db, setVersionInNewDatabase, synchronizer, error, errorMessage, success)); return adoptPtr(new DatabaseOpenTask(db, setVersionInNewDatabase, synchronizer, error, errorMessage, success));
} }
private: private:
DatabaseOpenTask(DatabaseBackend*, bool setVersionInNewDatabase, DatabaseTaskSynchronizer*, DatabaseError&, String& errorMessage, bool& success); DatabaseOpenTask(DatabaseBackend*, bool setVersionInNewDatabase, TaskSynchronizer*, DatabaseError&, String& errorMessage, bool& success);
virtual void doPerformTask() OVERRIDE; virtual void doPerformTask() OVERRIDE;
#if !LOG_DISABLED #if !LOG_DISABLED
...@@ -123,13 +98,13 @@ private: ...@@ -123,13 +98,13 @@ private:
class DatabaseBackend::DatabaseCloseTask FINAL : public DatabaseTask { class DatabaseBackend::DatabaseCloseTask FINAL : public DatabaseTask {
public: public:
static PassOwnPtr<DatabaseCloseTask> create(DatabaseBackend* db, DatabaseTaskSynchronizer* synchronizer) static PassOwnPtr<DatabaseCloseTask> create(DatabaseBackend* db, TaskSynchronizer* synchronizer)
{ {
return adoptPtr(new DatabaseCloseTask(db, synchronizer)); return adoptPtr(new DatabaseCloseTask(db, synchronizer));
} }
private: private:
DatabaseCloseTask(DatabaseBackend*, DatabaseTaskSynchronizer*); DatabaseCloseTask(DatabaseBackend*, TaskSynchronizer*);
virtual void doPerformTask() OVERRIDE; virtual void doPerformTask() OVERRIDE;
#if !LOG_DISABLED #if !LOG_DISABLED
...@@ -163,13 +138,13 @@ private: ...@@ -163,13 +138,13 @@ private:
class DatabaseBackend::DatabaseTableNamesTask FINAL : public DatabaseTask { class DatabaseBackend::DatabaseTableNamesTask FINAL : public DatabaseTask {
public: public:
static PassOwnPtr<DatabaseTableNamesTask> create(DatabaseBackend* db, DatabaseTaskSynchronizer* synchronizer, Vector<String>& names) static PassOwnPtr<DatabaseTableNamesTask> create(DatabaseBackend* db, TaskSynchronizer* synchronizer, Vector<String>& names)
{ {
return adoptPtr(new DatabaseTableNamesTask(db, synchronizer, names)); return adoptPtr(new DatabaseTableNamesTask(db, synchronizer, names));
} }
private: private:
DatabaseTableNamesTask(DatabaseBackend*, DatabaseTaskSynchronizer*, Vector<String>& names); DatabaseTableNamesTask(DatabaseBackend*, TaskSynchronizer*, Vector<String>& names);
virtual void doPerformTask() OVERRIDE; virtual void doPerformTask() OVERRIDE;
#if !LOG_DISABLED #if !LOG_DISABLED
......
...@@ -83,7 +83,7 @@ void DatabaseThread::setupDatabaseThread() ...@@ -83,7 +83,7 @@ void DatabaseThread::setupDatabaseThread()
ThreadState::current()->addInterruptor(m_messageLoopInterruptor.get()); ThreadState::current()->addInterruptor(m_messageLoopInterruptor.get());
} }
void DatabaseThread::requestTermination(DatabaseTaskSynchronizer *cleanupSync) void DatabaseThread::requestTermination(TaskSynchronizer *cleanupSync)
{ {
MutexLocker lock(m_terminationRequestedMutex); MutexLocker lock(m_terminationRequestedMutex);
ASSERT(!m_terminationRequested); ASSERT(!m_terminationRequested);
...@@ -93,7 +93,7 @@ void DatabaseThread::requestTermination(DatabaseTaskSynchronizer *cleanupSync) ...@@ -93,7 +93,7 @@ void DatabaseThread::requestTermination(DatabaseTaskSynchronizer *cleanupSync)
m_thread->postTask(new Task(WTF::bind(&DatabaseThread::cleanupDatabaseThread, this))); m_thread->postTask(new Task(WTF::bind(&DatabaseThread::cleanupDatabaseThread, this)));
} }
bool DatabaseThread::terminationRequested(DatabaseTaskSynchronizer* taskSynchronizer) const bool DatabaseThread::terminationRequested(TaskSynchronizer* taskSynchronizer) const
{ {
#ifndef NDEBUG #ifndef NDEBUG
if (taskSynchronizer) if (taskSynchronizer)
......
...@@ -44,12 +44,12 @@ namespace WebCore { ...@@ -44,12 +44,12 @@ namespace WebCore {
class DatabaseBackend; class DatabaseBackend;
class DatabaseTask; class DatabaseTask;
class DatabaseTaskSynchronizer;
class Document; class Document;
class MessageLoopInterruptor; class MessageLoopInterruptor;
class PendingGCRunner; class PendingGCRunner;
class SQLTransactionClient; class SQLTransactionClient;
class SQLTransactionCoordinator; class SQLTransactionCoordinator;
class TaskSynchronizer;
class DatabaseThread : public ThreadSafeRefCountedWillBeGarbageCollectedFinalized<DatabaseThread> { class DatabaseThread : public ThreadSafeRefCountedWillBeGarbageCollectedFinalized<DatabaseThread> {
public: public:
...@@ -58,8 +58,8 @@ public: ...@@ -58,8 +58,8 @@ public:
void trace(Visitor*); void trace(Visitor*);
void start(); void start();
void requestTermination(DatabaseTaskSynchronizer* cleanupSync); void requestTermination(TaskSynchronizer* cleanupSync);
bool terminationRequested(DatabaseTaskSynchronizer* taskSynchronizer = 0) const; bool terminationRequested(TaskSynchronizer* = 0) const;
void scheduleTask(PassOwnPtr<DatabaseTask>); void scheduleTask(PassOwnPtr<DatabaseTask>);
...@@ -88,7 +88,7 @@ private: ...@@ -88,7 +88,7 @@ private:
OwnPtr<SQLTransactionClient> m_transactionClient; OwnPtr<SQLTransactionClient> m_transactionClient;
OwnPtrWillBeMember<SQLTransactionCoordinator> m_transactionCoordinator; OwnPtrWillBeMember<SQLTransactionCoordinator> m_transactionCoordinator;
DatabaseTaskSynchronizer* m_cleanupSync; TaskSynchronizer* m_cleanupSync;
mutable Mutex m_terminationRequestedMutex; mutable Mutex m_terminationRequestedMutex;
bool m_terminationRequested; bool m_terminationRequested;
......
...@@ -25,17 +25,15 @@ ...@@ -25,17 +25,15 @@
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/ */
#include "config.h" #include "config.h"
#include "modules/webdatabase/DatabaseTask.h" #include "platform/TaskSynchronizer.h"
#include "platform/Logging.h" #include "heap/ThreadState.h"
#include "modules/webdatabase/Database.h"
#include "modules/webdatabase/DatabaseContext.h"
#include "modules/webdatabase/DatabaseThread.h"
namespace WebCore { namespace WebCore {
DatabaseTaskSynchronizer::DatabaseTaskSynchronizer() TaskSynchronizer::TaskSynchronizer()
: m_taskCompleted(false) : m_taskCompleted(false)
#ifndef NDEBUG #ifndef NDEBUG
, m_hasCheckedForTermination(false) , m_hasCheckedForTermination(false)
...@@ -43,7 +41,7 @@ DatabaseTaskSynchronizer::DatabaseTaskSynchronizer() ...@@ -43,7 +41,7 @@ DatabaseTaskSynchronizer::DatabaseTaskSynchronizer()
{ {
} }
void DatabaseTaskSynchronizer::waitForTaskCompletion() void TaskSynchronizer::waitForTaskCompletion()
{ {
// Prevent the deadlock between park request by other threads and blocking // Prevent the deadlock between park request by other threads and blocking
// by m_synchronousCondition. // by m_synchronousCondition.
...@@ -54,7 +52,7 @@ void DatabaseTaskSynchronizer::waitForTaskCompletion() ...@@ -54,7 +52,7 @@ void DatabaseTaskSynchronizer::waitForTaskCompletion()
m_synchronousMutex.unlock(); m_synchronousMutex.unlock();
} }
void DatabaseTaskSynchronizer::taskCompleted() void TaskSynchronizer::taskCompleted()
{ {
m_synchronousMutex.lock(); m_synchronousMutex.lock();
m_taskCompleted = true; m_taskCompleted = true;
...@@ -62,156 +60,4 @@ void DatabaseTaskSynchronizer::taskCompleted() ...@@ -62,156 +60,4 @@ void DatabaseTaskSynchronizer::taskCompleted()
m_synchronousMutex.unlock(); m_synchronousMutex.unlock();
} }
DatabaseTask::DatabaseTask(DatabaseBackend* database, DatabaseTaskSynchronizer* synchronizer)
: m_database(database)
, m_synchronizer(synchronizer)
#if !LOG_DISABLED
, m_complete(false)
#endif
{
}
DatabaseTask::~DatabaseTask()
{
#if !LOG_DISABLED
ASSERT(m_complete || !m_synchronizer);
#endif
}
void DatabaseTask::run()
{
// Database tasks are meant to be used only once, so make sure this one hasn't been performed before.
#if !LOG_DISABLED
ASSERT(!m_complete);
#endif
if (!m_synchronizer && !m_database->databaseContext()->databaseThread()->isDatabaseOpen(m_database.get())) {
taskCancelled();
#if !LOG_DISABLED
m_complete = true;
#endif
return;
}
WTF_LOG(StorageAPI, "Performing %s %p\n", debugTaskName(), this);
m_database->resetAuthorizer();
doPerformTask();
if (m_synchronizer)
m_synchronizer->taskCompleted();
#if !LOG_DISABLED
m_complete = true;
#endif
}
// *** DatabaseOpenTask ***
// Opens the database file and verifies the version matches the expected version.
DatabaseBackend::DatabaseOpenTask::DatabaseOpenTask(DatabaseBackend* database, bool setVersionInNewDatabase, DatabaseTaskSynchronizer* synchronizer, DatabaseError& error, String& errorMessage, bool& success)
: DatabaseTask(database, synchronizer)
, m_setVersionInNewDatabase(setVersionInNewDatabase)
, m_error(error)
, m_errorMessage(errorMessage)
, m_success(success)
{
ASSERT(synchronizer); // A task with output parameters is supposed to be synchronous.
}
void DatabaseBackend::DatabaseOpenTask::doPerformTask()
{
String errorMessage;
m_success = database()->performOpenAndVerify(m_setVersionInNewDatabase, m_error, errorMessage);
if (!m_success)
m_errorMessage = errorMessage.isolatedCopy();
}
#if !LOG_DISABLED
const char* DatabaseBackend::DatabaseOpenTask::debugTaskName() const
{
return "DatabaseOpenTask";
}
#endif
// *** DatabaseCloseTask ***
// Closes the database.
DatabaseBackend::DatabaseCloseTask::DatabaseCloseTask(DatabaseBackend* database, DatabaseTaskSynchronizer* synchronizer)
: DatabaseTask(database, synchronizer)
{
}
void DatabaseBackend::DatabaseCloseTask::doPerformTask()
{
Database::from(database())->close();
}
#if !LOG_DISABLED
const char* DatabaseBackend::DatabaseCloseTask::debugTaskName() const
{
return "DatabaseCloseTask";
}
#endif
// *** DatabaseTransactionTask ***
// Starts a transaction that will report its results via a callback.
DatabaseBackend::DatabaseTransactionTask::DatabaseTransactionTask(PassRefPtrWillBeRawPtr<SQLTransactionBackend> transaction)
: DatabaseTask(Database::from(transaction->database()), 0)
, m_transaction(transaction)
{
}
DatabaseBackend::DatabaseTransactionTask::~DatabaseTransactionTask()
{
}
void DatabaseBackend::DatabaseTransactionTask::doPerformTask()
{
m_transaction->performNextStep();
}
void DatabaseBackend::DatabaseTransactionTask::taskCancelled()
{
// If the task is being destructed without the transaction ever being run,
// then we must either have an error or an interruption. Give the
// transaction a chance to clean up since it may not have been able to
// run to its clean up state.
// Transaction phase 2 cleanup. See comment on "What happens if a
// transaction is interrupted?" at the top of SQLTransactionBackend.cpp.
m_transaction->notifyDatabaseThreadIsShuttingDown();
}
#if !LOG_DISABLED
const char* DatabaseBackend::DatabaseTransactionTask::debugTaskName() const
{
return "DatabaseTransactionTask";
}
#endif
// *** DatabaseTableNamesTask ***
// Retrieves a list of all tables in the database - for WebInspector support.
DatabaseBackend::DatabaseTableNamesTask::DatabaseTableNamesTask(DatabaseBackend* database, DatabaseTaskSynchronizer* synchronizer, Vector<String>& names)
: DatabaseTask(database, synchronizer)
, m_tableNames(names)
{
ASSERT(synchronizer); // A task with output parameters is supposed to be synchronous.
}
void DatabaseBackend::DatabaseTableNamesTask::doPerformTask()
{
m_tableNames = Database::from(database())->performGetTableNames();
}
#if !LOG_DISABLED
const char* DatabaseBackend::DatabaseTableNamesTask::debugTaskName() const
{
return "DatabaseTableNamesTask";
}
#endif
} // namespace WebCore } // namespace WebCore
...@@ -25,36 +25,27 @@ ...@@ -25,36 +25,27 @@
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/ */
#ifndef DatabaseTask_h
#define DatabaseTask_h
#include "heap/Handle.h" #ifndef TaskSynchronizer_h
#include "modules/webdatabase/DatabaseBackend.h" #define TaskSynchronizer_h
#include "modules/webdatabase/DatabaseBasicTypes.h"
#include "modules/webdatabase/DatabaseError.h" #include "platform/PlatformExport.h"
#include "modules/webdatabase/SQLTransactionBackend.h" #include "wtf/Noncopyable.h"
#include "platform/Task.h"
#include "wtf/OwnPtr.h"
#include "wtf/PassOwnPtr.h"
#include "wtf/PassRefPtr.h"
#include "wtf/RefPtr.h"
#include "wtf/Threading.h" #include "wtf/Threading.h"
#include "wtf/Vector.h" #include "wtf/ThreadingPrimitives.h"
#include "wtf/text/WTFString.h"
namespace WebCore { namespace WebCore {
// Can be used to wait until DatabaseTask is completed. // TaskSynchronizer can be used to wait for task completion.
// Has to be passed into DatabaseTask::create to be associated with the task. class PLATFORM_EXPORT TaskSynchronizer {
class DatabaseTaskSynchronizer { WTF_MAKE_NONCOPYABLE(TaskSynchronizer);
WTF_MAKE_NONCOPYABLE(DatabaseTaskSynchronizer);
public: public:
DatabaseTaskSynchronizer(); TaskSynchronizer();
// Called from main thread to wait until task is completed. // Called from a thread that waits for the task completion.
void waitForTaskCompletion(); void waitForTaskCompletion();
// Called by the task. // Called from a thread that executes the task.
void taskCompleted(); void taskCompleted();
#ifndef NDEBUG #ifndef NDEBUG
...@@ -71,114 +62,6 @@ private: ...@@ -71,114 +62,6 @@ private:
#endif #endif
}; };
class DatabaseTask : public blink::WebThread::Task {
WTF_MAKE_NONCOPYABLE(DatabaseTask); WTF_MAKE_FAST_ALLOCATED;
public:
virtual ~DatabaseTask();
virtual void run() OVERRIDE FINAL;
DatabaseBackend* database() const { return m_database.get(); }
#ifndef NDEBUG
bool hasSynchronizer() const { return m_synchronizer; }
bool hasCheckedForTermination() const { return m_synchronizer->hasCheckedForTermination(); }
#endif
protected:
DatabaseTask(DatabaseBackend*, DatabaseTaskSynchronizer*);
private:
virtual void doPerformTask() = 0;
virtual void taskCancelled() { }
RefPtrWillBeCrossThreadPersistent<DatabaseBackend> m_database;
DatabaseTaskSynchronizer* m_synchronizer;
#if !LOG_DISABLED
virtual const char* debugTaskName() const = 0;
bool m_complete;
#endif
};
class DatabaseBackend::DatabaseOpenTask FINAL : public DatabaseTask {
public:
static PassOwnPtr<DatabaseOpenTask> create(DatabaseBackend* db, bool setVersionInNewDatabase, DatabaseTaskSynchronizer* synchronizer, DatabaseError& error, String& errorMessage, bool& success)
{
return adoptPtr(new DatabaseOpenTask(db, setVersionInNewDatabase, synchronizer, error, errorMessage, success));
}
private:
DatabaseOpenTask(DatabaseBackend*, bool setVersionInNewDatabase, DatabaseTaskSynchronizer*, DatabaseError&, String& errorMessage, bool& success);
virtual void doPerformTask() OVERRIDE;
#if !LOG_DISABLED
virtual const char* debugTaskName() const OVERRIDE;
#endif
bool m_setVersionInNewDatabase;
DatabaseError& m_error;
String& m_errorMessage;
bool& m_success;
};
class DatabaseBackend::DatabaseCloseTask FINAL : public DatabaseTask {
public:
static PassOwnPtr<DatabaseCloseTask> create(DatabaseBackend* db, DatabaseTaskSynchronizer* synchronizer)
{
return adoptPtr(new DatabaseCloseTask(db, synchronizer));
}
private:
DatabaseCloseTask(DatabaseBackend*, DatabaseTaskSynchronizer*);
virtual void doPerformTask() OVERRIDE;
#if !LOG_DISABLED
virtual const char* debugTaskName() const OVERRIDE;
#endif
};
class DatabaseBackend::DatabaseTransactionTask FINAL : public DatabaseTask {
public:
virtual ~DatabaseTransactionTask();
// Transaction task is never synchronous, so no 'synchronizer' parameter.
static PassOwnPtr<DatabaseTransactionTask> create(PassRefPtrWillBeRawPtr<SQLTransactionBackend> transaction)
{
return adoptPtr(new DatabaseTransactionTask(transaction));
}
SQLTransactionBackend* transaction() const { return m_transaction.get(); }
private:
explicit DatabaseTransactionTask(PassRefPtrWillBeRawPtr<SQLTransactionBackend>);
virtual void doPerformTask() OVERRIDE;
virtual void taskCancelled() OVERRIDE;
#if !LOG_DISABLED
virtual const char* debugTaskName() const OVERRIDE;
#endif
RefPtrWillBeCrossThreadPersistent<SQLTransactionBackend> m_transaction;
};
class DatabaseBackend::DatabaseTableNamesTask FINAL : public DatabaseTask {
public:
static PassOwnPtr<DatabaseTableNamesTask> create(DatabaseBackend* db, DatabaseTaskSynchronizer* synchronizer, Vector<String>& names)
{
return adoptPtr(new DatabaseTableNamesTask(db, synchronizer, names));
}
private:
DatabaseTableNamesTask(DatabaseBackend*, DatabaseTaskSynchronizer*, Vector<String>& names);
virtual void doPerformTask() OVERRIDE;
#if !LOG_DISABLED
virtual const char* debugTaskName() const OVERRIDE;
#endif
Vector<String>& m_tableNames;
};
} // namespace WebCore } // namespace WebCore
#endif // DatabaseTask_h #endif // TaskSynchronizer_h
...@@ -40,6 +40,7 @@ ...@@ -40,6 +40,7 @@
'variables': { 'enable_wexit_time_destructors': 1 }, 'variables': { 'enable_wexit_time_destructors': 1 },
'dependencies': [ 'dependencies': [
'../config.gyp:config', '../config.gyp:config',
'../heap/blink_heap.gyp:blink_heap',
'../wtf/wtf.gyp:wtf', '../wtf/wtf.gyp:wtf',
# FIXME: Can we remove the dependency on Skia? # FIXME: Can we remove the dependency on Skia?
'<(DEPTH)/skia/skia.gyp:skia', '<(DEPTH)/skia/skia.gyp:skia',
...@@ -125,6 +126,7 @@ ...@@ -125,6 +126,7 @@
'type': '<(component)', 'type': '<(component)',
'dependencies': [ 'dependencies': [
'../config.gyp:config', '../config.gyp:config',
'../heap/blink_heap.gyp:blink_heap',
'../wtf/wtf.gyp:wtf', '../wtf/wtf.gyp:wtf',
'blink_common', 'blink_common',
'blink_prerequisites', 'blink_prerequisites',
......
...@@ -126,6 +126,8 @@ ...@@ -126,6 +126,8 @@
'StorageQuotaCallbacks.h', 'StorageQuotaCallbacks.h',
'Supplementable.h', 'Supplementable.h',
'Task.h', 'Task.h',
'TaskSynchronizer.cpp',
'TaskSynchronizer.h',
'ThemeTypes.h', 'ThemeTypes.h',
'Theme.cpp', 'Theme.cpp',
'Theme.h', 'Theme.h',
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment