[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