diff options
author | Shimeng (Simon) Wang <swang@google.com> | 2010-12-07 17:22:45 -0800 |
---|---|---|
committer | Shimeng (Simon) Wang <swang@google.com> | 2010-12-22 14:15:40 -0800 |
commit | 4576aa36e9a9671459299c7963ac95aa94beaea9 (patch) | |
tree | 3863574e050f168c0126ecb47c83319fab0972d8 /WebKit/chromium/src/WorkerFileWriterCallbacksBridge.cpp | |
parent | 55323ac613cc31553107b68603cb627264d22bb0 (diff) | |
download | external_webkit-4576aa36e9a9671459299c7963ac95aa94beaea9.zip external_webkit-4576aa36e9a9671459299c7963ac95aa94beaea9.tar.gz external_webkit-4576aa36e9a9671459299c7963ac95aa94beaea9.tar.bz2 |
Merge WebKit at r73109: Initial merge by git.
Change-Id: I61f1a66d9642e3d8405d3ac6ccab2a53421c75d8
Diffstat (limited to 'WebKit/chromium/src/WorkerFileWriterCallbacksBridge.cpp')
-rw-r--r-- | WebKit/chromium/src/WorkerFileWriterCallbacksBridge.cpp | 29 |
1 files changed, 28 insertions, 1 deletions
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) |