diff options
author | kinuko@chromium.org <kinuko@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-08-06 11:26:49 +0000 |
---|---|---|
committer | kinuko@chromium.org <kinuko@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-08-06 11:26:49 +0000 |
commit | 7047cee045ad56971bfa57fdbd3053e374272a2a (patch) | |
tree | 836366274cad1028d174b4a0c0857252e2c85760 /content/child/fileapi | |
parent | 98ec18cd871abf80d6f6e6e0063166da8c913705 (diff) | |
download | chromium_src-7047cee045ad56971bfa57fdbd3053e374272a2a.zip chromium_src-7047cee045ad56971bfa57fdbd3053e374272a2a.tar.gz chromium_src-7047cee045ad56971bfa57fdbd3053e374272a2a.tar.bz2 |
2nd try: Support synchronous mode in WebFileWriterImpl
BUG=257349
TEST=no behavioral change yet
Review URL: https://chromiumcodereview.appspot.com/22363002
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@215871 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'content/child/fileapi')
-rw-r--r-- | content/child/fileapi/webfilesystem_impl.cc | 9 | ||||
-rw-r--r-- | content/child/fileapi/webfilewriter_impl.cc | 54 | ||||
-rw-r--r-- | content/child/fileapi/webfilewriter_impl.h | 6 |
3 files changed, 57 insertions, 12 deletions
diff --git a/content/child/fileapi/webfilesystem_impl.cc b/content/child/fileapi/webfilesystem_impl.cc index 78952b5..052bce4 100644 --- a/content/child/fileapi/webfilesystem_impl.cc +++ b/content/child/fileapi/webfilesystem_impl.cc @@ -252,8 +252,11 @@ void DidCreateFileWriter( callbacks->didFail(WebKit::WebFileErrorInvalidState); return; } + WebFileWriterImpl::Type type = callbacks->shouldBlockUntilCompletion() ? + WebFileWriterImpl::TYPE_SYNC : WebFileWriterImpl::TYPE_ASYNC; callbacks->didCreateFileWriter( - new WebFileWriterImpl(path, client, main_thread_loop), file_info.size); + new WebFileWriterImpl(path, client, type, main_thread_loop), + file_info.size); } void CreateFileWriterCallbackAdapter( @@ -488,7 +491,9 @@ base::Unretained(waitable_results))), WebKit::WebFileWriter* WebFileSystemImpl::createFileWriter( const WebURL& path, WebKit::WebFileWriterClient* client) { - return new WebFileWriterImpl(GURL(path), client, main_thread_loop_.get()); + return new WebFileWriterImpl(GURL(path), client, + WebFileWriterImpl::TYPE_ASYNC, + main_thread_loop_.get()); } void WebFileSystemImpl::createFileWriter( diff --git a/content/child/fileapi/webfilewriter_impl.cc b/content/child/fileapi/webfilewriter_impl.cc index 881c57c..3347ea4 100644 --- a/content/child/fileapi/webfilewriter_impl.cc +++ b/content/child/fileapi/webfilewriter_impl.cc @@ -6,6 +6,7 @@ #include "base/bind.h" #include "base/platform_file.h" +#include "base/synchronization/waitable_event.h" #include "content/child/child_thread.h" #include "content/child/fileapi/file_system_dispatcher.h" #include "webkit/child/worker_task_runner.h" @@ -31,9 +32,13 @@ typedef FileSystemDispatcher::WriteCallback WriteCallback; class WebFileWriterImpl::WriterBridge : public base::RefCountedThreadSafe<WriterBridge> { public: - WriterBridge() + WriterBridge(WebFileWriterImpl::Type type) : request_id_(0), - thread_id_(WorkerTaskRunner::Instance()->CurrentWorkerId()) {} + thread_id_(WorkerTaskRunner::Instance()->CurrentWorkerId()), + written_bytes_(0) { + if (type == WebFileWriterImpl::TYPE_SYNC) + waitable_event_.reset(new base::WaitableEvent(false, false)); + } void Truncate(const GURL& path, int64 offset, const StatusCallback& status_callback) { @@ -67,12 +72,25 @@ class WebFileWriterImpl::WriterBridge base::Bind(&WriterBridge::DidFinish, this)); } + base::WaitableEvent* waitable_event() { + return waitable_event_.get(); + } + + void WaitAndRun() { + waitable_event_->Wait(); + DCHECK(!results_closure_.is_null()); + results_closure_.Run(); + } + private: friend class base::RefCountedThreadSafe<WriterBridge>; virtual ~WriterBridge() {} void DidWrite(int64 bytes, bool complete) { - PostTaskToWorker(base::Bind(write_callback_, bytes, complete)); + written_bytes_ += bytes; + if (waitable_event_ && !complete) + return; + PostTaskToWorker(base::Bind(write_callback_, written_bytes_, complete)); } void DidFinish(base::PlatformFileError status) { @@ -80,24 +98,36 @@ class WebFileWriterImpl::WriterBridge } void PostTaskToWorker(const base::Closure& closure) { - if (!thread_id_) + written_bytes_ = 0; + if (!thread_id_) { + DCHECK(!waitable_event_); closure.Run(); - else - WorkerTaskRunner::Instance()->PostTask(thread_id_, closure); + return; + } + if (waitable_event_) { + results_closure_ = closure; + waitable_event_->Signal(); + return; + } + WorkerTaskRunner::Instance()->PostTask(thread_id_, closure); } StatusCallback status_callback_; WriteCallback write_callback_; int request_id_; int thread_id_; + int written_bytes_; + scoped_ptr<base::WaitableEvent> waitable_event_; + base::Closure results_closure_; }; WebFileWriterImpl::WebFileWriterImpl( const GURL& path, WebKit::WebFileWriterClient* client, + Type type, base::MessageLoopProxy* main_thread_loop) : WebFileWriterBase(path, client), main_thread_loop_(main_thread_loop), - bridge_(new WriterBridge) { + bridge_(new WriterBridge(type)) { } WebFileWriterImpl::~WebFileWriterImpl() { @@ -123,10 +153,14 @@ void WebFileWriterImpl::DoCancel() { } void WebFileWriterImpl::RunOnMainThread(const base::Closure& closure) { - if (main_thread_loop_->RunsTasksOnCurrentThread()) + if (main_thread_loop_->RunsTasksOnCurrentThread()) { + DCHECK(!bridge_->waitable_event()); closure.Run(); - else - main_thread_loop_->PostTask(FROM_HERE, closure); + return; + } + main_thread_loop_->PostTask(FROM_HERE, closure); + if (bridge_->waitable_event()) + bridge_->WaitAndRun(); } } // namespace content diff --git a/content/child/fileapi/webfilewriter_impl.h b/content/child/fileapi/webfilewriter_impl.h index a9e574e..e7b49b6 100644 --- a/content/child/fileapi/webfilewriter_impl.h +++ b/content/child/fileapi/webfilewriter_impl.h @@ -16,8 +16,14 @@ namespace content { class WebFileWriterImpl : public fileapi::WebFileWriterBase, public base::SupportsWeakPtr<WebFileWriterImpl> { public: + enum Type { + TYPE_SYNC, + TYPE_ASYNC, + }; + WebFileWriterImpl(const GURL& path, WebKit::WebFileWriterClient* client, + Type type, base::MessageLoopProxy* main_thread_loop); virtual ~WebFileWriterImpl(); |