[SCM] WebKit Debian packaging branch, debian/experimental, updated. upstream/1.3.3-9427-gc2be6fc

commit-queue at webkit.org commit-queue at webkit.org
Wed Dec 22 16:31:31 UTC 2010


The following commit has been merged in the debian/experimental branch:
commit fcff7f2c27269b4985cb934808bbe16f9f91d63f
Author: commit-queue at webkit.org <commit-queue at webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Date:   Thu Nov 25 01:55:26 2010 +0000

    2010-11-24  Eric Uhrhane  <ericu at chromium.org>
    
            Reviewed by David Levin.
    
            [Chromium] Implement FileWriterSync
            https://bugs.webkit.org/show_bug.cgi?id=49940
    
            Added waitForOperationToComplete, delegating to the bridge.
            * src/WorkerAsyncFileWriterChromium.cpp:
            * src/WorkerAsyncFileWriterChromium.h:
    
            Added waitForOperationToComplete and some debug-only code to make sure it's working properly.
            * src/WorkerFileWriterCallbacksBridge.cpp:
            (WebKit::WorkerFileWriterCallbacksBridge::postWriteToMainThread):
            (WebKit::WorkerFileWriterCallbacksBridge::postTruncateToMainThread):
            (WebKit::WorkerFileWriterCallbacksBridge::postAbortToMainThread):
            (WebKit::WorkerFileWriterCallbacksBridge::WorkerFileWriterCallbacksBridge):
            (WebKit::WorkerFileWriterCallbacksBridge::didWriteOnWorkerThread):
            (WebKit::WorkerFileWriterCallbacksBridge::didFailOnWorkerThread):
            (WebKit::WorkerFileWriterCallbacksBridge::didTruncateOnWorkerThread):
            (WebKit::WorkerFileWriterCallbacksBridge::waitForOperationToComplete):
            * src/WorkerFileWriterCallbacksBridge.h:
    
    git-svn-id: http://svn.webkit.org/repository/webkit/trunk@72711 268f45cc-cd09-0410-ab3c-d52691b4dbfc

diff --git a/WebKit/chromium/ChangeLog b/WebKit/chromium/ChangeLog
index be85cca..a67481d 100644
--- a/WebKit/chromium/ChangeLog
+++ b/WebKit/chromium/ChangeLog
@@ -1,3 +1,26 @@
+2010-11-24  Eric Uhrhane  <ericu at chromium.org>
+
+        Reviewed by David Levin.
+
+        [Chromium] Implement FileWriterSync
+        https://bugs.webkit.org/show_bug.cgi?id=49940
+
+        Added waitForOperationToComplete, delegating to the bridge.
+        * src/WorkerAsyncFileWriterChromium.cpp:
+        * src/WorkerAsyncFileWriterChromium.h:
+
+        Added waitForOperationToComplete and some debug-only code to make sure it's working properly.
+        * src/WorkerFileWriterCallbacksBridge.cpp:
+        (WebKit::WorkerFileWriterCallbacksBridge::postWriteToMainThread):
+        (WebKit::WorkerFileWriterCallbacksBridge::postTruncateToMainThread):
+        (WebKit::WorkerFileWriterCallbacksBridge::postAbortToMainThread):
+        (WebKit::WorkerFileWriterCallbacksBridge::WorkerFileWriterCallbacksBridge):
+        (WebKit::WorkerFileWriterCallbacksBridge::didWriteOnWorkerThread):
+        (WebKit::WorkerFileWriterCallbacksBridge::didFailOnWorkerThread):
+        (WebKit::WorkerFileWriterCallbacksBridge::didTruncateOnWorkerThread):
+        (WebKit::WorkerFileWriterCallbacksBridge::waitForOperationToComplete):
+        * src/WorkerFileWriterCallbacksBridge.h:
+
 2010-11-24  Kenneth Russell  <kbr at google.com>
 
         Reviewed by Darin Fisher.
diff --git a/WebKit/chromium/src/WorkerAsyncFileWriterChromium.cpp b/WebKit/chromium/src/WorkerAsyncFileWriterChromium.cpp
index 8d8e469..0d0ac8b 100644
--- a/WebKit/chromium/src/WorkerAsyncFileWriterChromium.cpp
+++ b/WebKit/chromium/src/WorkerAsyncFileWriterChromium.cpp
@@ -64,6 +64,11 @@ WorkerAsyncFileWriterChromium::~WorkerAsyncFileWriterChromium()
     m_bridge->postShutdownToMainThread(m_bridge);
 }
 
+bool WorkerAsyncFileWriterChromium::waitForOperationToComplete()
+{
+    return m_bridge->waitForOperationToComplete();
+}
+
 void WorkerAsyncFileWriterChromium::write(long long position, Blob* data)
 {
     m_bridge->postWriteToMainThread(position, data->url());
diff --git a/WebKit/chromium/src/WorkerAsyncFileWriterChromium.h b/WebKit/chromium/src/WorkerAsyncFileWriterChromium.h
index 55d8d24..01058c3 100644
--- a/WebKit/chromium/src/WorkerAsyncFileWriterChromium.h
+++ b/WebKit/chromium/src/WorkerAsyncFileWriterChromium.h
@@ -67,6 +67,8 @@ public:
     }
     ~WorkerAsyncFileWriterChromium();
     
+    bool waitForOperationToComplete();
+
     // FileWriter
     virtual void write(long long position, Blob* data);
     virtual void truncate(long long length);
diff --git a/WebKit/chromium/src/WorkerFileWriterCallbacksBridge.cpp b/WebKit/chromium/src/WorkerFileWriterCallbacksBridge.cpp
index 827c011..179aea5 100644
--- a/WebKit/chromium/src/WorkerFileWriterCallbacksBridge.cpp
+++ b/WebKit/chromium/src/WorkerFileWriterCallbacksBridge.cpp
@@ -59,16 +59,21 @@ void WorkerFileWriterCallbacksBridge::notifyStop()
 
 void WorkerFileWriterCallbacksBridge::postWriteToMainThread(long long position, const KURL& data)
 {
+    ASSERT(!m_operationInProgress);
+    m_operationInProgress = true;
     dispatchTaskToMainThread(createCallbackTask(&writeOnMainThread, this, position, data));
 }
 
 void WorkerFileWriterCallbacksBridge::postTruncateToMainThread(long long length)
 {
+    ASSERT(!m_operationInProgress);
+    m_operationInProgress = true;
     dispatchTaskToMainThread(createCallbackTask(&truncateOnMainThread, this, length));
 }
 
 void WorkerFileWriterCallbacksBridge::postAbortToMainThread()
 {
+    ASSERT(m_operationInProgress);
     dispatchTaskToMainThread(createCallbackTask(&abortOnMainThread, this));
 }
 
@@ -121,14 +126,19 @@ void WorkerFileWriterCallbacksBridge::didTruncate()
     dispatchTaskToWorkerThread(createCallbackTask(&didTruncateOnWorkerThread, this));
 }
 
+static const char fileWriterOperationsMode[] = "fileWriterOperationsMode";
+
 WorkerFileWriterCallbacksBridge::WorkerFileWriterCallbacksBridge(const String& path, WorkerLoaderProxy* proxy, ScriptExecutionContext* scriptExecutionContext, AsyncFileWriterClient* client)
     : WorkerContext::Observer(static_cast<WorkerContext*>(scriptExecutionContext))
     , m_proxy(proxy)
     , m_workerContext(scriptExecutionContext)
     , m_clientOnWorkerThread(client)
     , m_writerDeleted(false)
+    , m_operationInProgress(false)
 {
     ASSERT(m_workerContext->isContextThread());
+    m_mode = fileWriterOperationsMode;
+    m_mode.append(String::number(static_cast<WorkerContext*>(scriptExecutionContext)->thread()->runLoop().createUniqueId()));
     postInitToMainThread(path);
 }
 
@@ -147,18 +157,25 @@ WorkerFileWriterCallbacksBridge::~WorkerFileWriterCallbacksBridge()
 void WorkerFileWriterCallbacksBridge::didWriteOnWorkerThread(ScriptExecutionContext*, PassRefPtr<WorkerFileWriterCallbacksBridge> bridge, long long length, bool complete)
 {
     ASSERT(bridge->m_workerContext->isContextThread());
+    ASSERT(bridge->m_operationInProgress);
+    if (complete)
+        bridge->m_operationInProgress = false;
     bridge->m_clientOnWorkerThread->didWrite(length, complete);
 }
 
 void WorkerFileWriterCallbacksBridge::didFailOnWorkerThread(ScriptExecutionContext*, PassRefPtr<WorkerFileWriterCallbacksBridge> bridge, WebFileError error)
 {
     ASSERT(bridge->m_workerContext->isContextThread());
+    ASSERT(bridge->m_operationInProgress);
+    bridge->m_operationInProgress = false;
     bridge->m_clientOnWorkerThread->didFail(static_cast<FileError::ErrorCode>(error));
 }
 
 void WorkerFileWriterCallbacksBridge::didTruncateOnWorkerThread(ScriptExecutionContext*, PassRefPtr<WorkerFileWriterCallbacksBridge> bridge)
 {
     ASSERT(bridge->m_workerContext->isContextThread());
+    ASSERT(bridge->m_operationInProgress);
+    bridge->m_operationInProgress = false;
     bridge->m_clientOnWorkerThread->didTruncate();
 }
 
@@ -185,9 +202,19 @@ void WorkerFileWriterCallbacksBridge::dispatchTaskToMainThread(PassOwnPtr<Script
 void WorkerFileWriterCallbacksBridge::dispatchTaskToWorkerThread(PassOwnPtr<ScriptExecutionContext::Task> task)
 {
     ASSERT(isMainThread());
-    m_proxy->postTaskForModeToWorkerContext(createCallbackTask(&runTaskOnWorkerThread, this, task), WorkerRunLoop::defaultMode());
+    m_proxy->postTaskForModeToWorkerContext(createCallbackTask(&runTaskOnWorkerThread, this, task), m_mode);
 }
 
+bool WorkerFileWriterCallbacksBridge::waitForOperationToComplete()
+{
+    while (m_operationInProgress) {
+        WorkerContext* context = static_cast<WorkerContext*>(m_workerContext);
+        if (context->thread()->runLoop().runInMode(context, m_mode) == MessageQueueTerminated)
+            return false;
+    }
+    return true;
 }
 
+} // namespace WebKit
+
 #endif // ENABLE(FILE_SYSTEM)
diff --git a/WebKit/chromium/src/WorkerFileWriterCallbacksBridge.h b/WebKit/chromium/src/WorkerFileWriterCallbacksBridge.h
index d2e416e..62e333c 100644
--- a/WebKit/chromium/src/WorkerFileWriterCallbacksBridge.h
+++ b/WebKit/chromium/src/WorkerFileWriterCallbacksBridge.h
@@ -106,6 +106,9 @@ public:
     void didFail(WebFileError);
     void didTruncate();
 
+    // Call this on the context thread to wait for the current operation to complete.
+    bool waitForOperationToComplete();
+
 private:
     WorkerFileWriterCallbacksBridge(const String& path, WebCore::WorkerLoaderProxy*, WebCore::ScriptExecutionContext*, WebCore::AsyncFileWriterClient*);
 
@@ -147,6 +150,12 @@ private:
 
     // Used to indicate that shutdown has started on the main thread, and hence the writer has been deleted.
     bool m_writerDeleted;
+
+    // Used by waitForOperationToComplete.
+    bool m_operationInProgress;
+
+    // Used by postTaskForModeToWorkerContext and runInMode.
+    String m_mode;
 };
 
 } // namespace WebCore

-- 
WebKit Debian packaging



More information about the Pkg-webkit-commits mailing list