Index: Source/platform/TaskSynchronizer.h |
diff --git a/Source/platform/TaskSynchronizer.h b/Source/platform/TaskSynchronizer.h |
index 049c1b70d72b524cdb673e97c6c336a1d5d9b373..cc9efafd0f0eefc65fe3d6f71b745d4e5c1047c1 100644 |
--- a/Source/platform/TaskSynchronizer.h |
+++ b/Source/platform/TaskSynchronizer.h |
@@ -25,27 +25,36 @@ |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
*/ |
+#ifndef DatabaseTask_h |
+#define DatabaseTask_h |
-#ifndef TaskSynchronizer_h |
-#define TaskSynchronizer_h |
- |
-#include "platform/PlatformExport.h" |
-#include "wtf/Noncopyable.h" |
+#include "heap/Handle.h" |
+#include "modules/webdatabase/DatabaseBackend.h" |
+#include "modules/webdatabase/DatabaseBasicTypes.h" |
+#include "modules/webdatabase/DatabaseError.h" |
+#include "modules/webdatabase/SQLTransactionBackend.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/ThreadingPrimitives.h" |
+#include "wtf/Vector.h" |
+#include "wtf/text/WTFString.h" |
namespace WebCore { |
-// TaskSynchronizer can be used to wait for task completion. |
-class PLATFORM_EXPORT TaskSynchronizer { |
- WTF_MAKE_NONCOPYABLE(TaskSynchronizer); |
+// 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: |
- TaskSynchronizer(); |
+ DatabaseTaskSynchronizer(); |
- // Called from a thread that waits for the task completion. |
+ // Called from main thread to wait until task is completed. |
void waitForTaskCompletion(); |
- // Called from a thread that executes the task. |
+ // Called by the task. |
void taskCompleted(); |
#ifndef NDEBUG |
@@ -62,6 +71,114 @@ private: |
#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 |
-#endif // TaskSynchronizer_h |
+#endif // DatabaseTask_h |