Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(241)

Unified Diff: components/leveldb/leveldb_file_thread.cc

Issue 1839823002: mojo leveldb: Remove the created file thread. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: And cut out manual Signal()ing most places. Created 4 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « components/leveldb/leveldb_file_thread.h ('k') | components/leveldb/leveldb_mojo_proxy.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: components/leveldb/leveldb_file_thread.cc
diff --git a/components/leveldb/leveldb_file_thread.cc b/components/leveldb/leveldb_file_thread.cc
deleted file mode 100644
index efad40e36d86df8c1a5a51066908a9e7c675042f..0000000000000000000000000000000000000000
--- a/components/leveldb/leveldb_file_thread.cc
+++ /dev/null
@@ -1,709 +0,0 @@
-// Copyright 2016 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "components/leveldb/leveldb_file_thread.h"
-
-#include <set>
-
-#include "base/bind.h"
-#include "mojo/message_pump/message_pump_mojo.h"
-#include "mojo/platform_handle/platform_handle_functions.h"
-
-namespace leveldb {
-
-namespace {
-const char kLevelDBFileThreadName[] = "LevelDB_File_Thread";
-} // namespace
-
-struct LevelDBFileThread::OpaqueLock {
- filesystem::FilePtr lock_file;
-};
-
-struct LevelDBFileThread::OpaqueDir {
- explicit OpaqueDir(
- mojo::InterfacePtrInfo<filesystem::Directory> directory_info) {
- directory.Bind(std::move(directory_info));
- }
-
- filesystem::DirectoryPtr directory;
-};
-
-struct LevelDBFileThread::WaitableEventDependencies {
- WaitableEventDependencies() {}
- ~WaitableEventDependencies() {}
- std::set<filesystem::DirectoryPtr*> directories;
- std::set<filesystem::FilePtr*> files;
-};
-
-LevelDBFileThread::LevelDBFileThread()
- : base::Thread(kLevelDBFileThreadName),
- outstanding_opaque_dirs_(0) {
- base::Thread::Options options;
- options.message_pump_factory =
- base::Bind(&mojo::common::MessagePumpMojo::Create);
- StartWithOptions(options);
-}
-
-LevelDBFileThread::OpaqueDir* LevelDBFileThread::RegisterDirectory(
- filesystem::DirectoryPtr directory) {
- DCHECK_NE(GetThreadId(), base::PlatformThread::CurrentId());
-
- OpaqueDir* out_dir = nullptr;
-
- // This proxies to the other thread, which proxies to mojo. Only on the reply
- // from mojo do we return from this.
- base::WaitableEvent done_event(false, false);
- task_runner()->PostTask(
- FROM_HERE, base::Bind(&LevelDBFileThread::RegisterDirectoryImpl,
- this,
- &done_event,
- base::Passed(directory.PassInterface()),
- &out_dir));
- done_event.Wait();
-
- return out_dir;
-}
-
-void LevelDBFileThread::UnregisterDirectory(OpaqueDir* dir) {
- DCHECK_NE(GetThreadId(), base::PlatformThread::CurrentId());
-
- // This proxies to the other thread, which proxies to mojo. Only on the reply
- // from mojo do we return from this.
- base::WaitableEvent done_event(false, false);
- task_runner()->PostTask(
- FROM_HERE, base::Bind(&LevelDBFileThread::UnregisterDirectoryImpl,
- this,
- &done_event,
- dir));
- done_event.Wait();
-}
-
-base::File LevelDBFileThread::OpenFileHandle(OpaqueDir* dir,
- const std::string& name,
- uint32_t open_flags) {
- DCHECK_NE(GetThreadId(), base::PlatformThread::CurrentId());
-
- base::File file;
-
- // This proxies to the other thread, which proxies to mojo. Only on the reply
- // from mojo do we return from this.
- base::WaitableEvent done_event(false, false);
- task_runner()->PostTask(
- FROM_HERE, base::Bind(&LevelDBFileThread::OpenFileHandleImpl, this,
- dir, name, &done_event, open_flags, &file));
- done_event.Wait();
-
- return file;
-}
-
-filesystem::FileError LevelDBFileThread::SyncDirectory(
- OpaqueDir* dir,
- const std::string& name) {
- DCHECK_NE(GetThreadId(), base::PlatformThread::CurrentId());
-
- filesystem::FileError error;
-
- // This proxies to the other thread, which proxies to mojo. Only on the reply
- // from mojo do we return from this.
- base::WaitableEvent done_event(false, false);
- task_runner()->PostTask(
- FROM_HERE, base::Bind(&LevelDBFileThread::SyncDirectoryImpl, this,
- dir, name, &done_event, &error));
- done_event.Wait();
-
- return error;
-}
-
-bool LevelDBFileThread::FileExists(OpaqueDir* dir,
- const std::string& name) {
- DCHECK_NE(GetThreadId(), base::PlatformThread::CurrentId());
-
- bool exists;
-
- // This proxies to the other thread, which proxies to mojo. Only on the reply
- // from mojo do we return from this.
- base::WaitableEvent done_event(false, false);
- task_runner()->PostTask(
- FROM_HERE, base::Bind(&LevelDBFileThread::FileExistsImpl, this,
- dir, name, &done_event, &exists));
- done_event.Wait();
-
- return exists;
-}
-
-filesystem::FileError LevelDBFileThread::GetChildren(
- OpaqueDir* dir,
- const std::string& path,
- std::vector<std::string>* result) {
- DCHECK_NE(GetThreadId(), base::PlatformThread::CurrentId());
-
- filesystem::FileError error;
-
- // This proxies to the other thread, which proxies to mojo. Only on the reply
- // from mojo do we return from this.
- base::WaitableEvent done_event(false, false);
- task_runner()->PostTask(
- FROM_HERE, base::Bind(&LevelDBFileThread::GetChildrenImpl, this,
- dir, path, result, &done_event, &error));
- done_event.Wait();
-
- return error;
-}
-
-filesystem::FileError LevelDBFileThread::Delete(OpaqueDir* dir,
- const std::string& path,
- uint32_t delete_flags) {
- DCHECK_NE(GetThreadId(), base::PlatformThread::CurrentId());
-
- filesystem::FileError error;
-
- // This proxies to the other thread, which proxies to mojo. Only on the reply
- // from mojo do we return from this.
- base::WaitableEvent done_event(false, false);
- task_runner()->PostTask(FROM_HERE,
- base::Bind(&LevelDBFileThread::DeleteImpl, this,
- dir, path, delete_flags, &done_event,
- &error));
- done_event.Wait();
-
- return error;
-}
-
-filesystem::FileError LevelDBFileThread::CreateDir(OpaqueDir* dir,
- const std::string& path) {
- DCHECK_NE(GetThreadId(), base::PlatformThread::CurrentId());
-
- filesystem::FileError error;
-
- // This proxies to the other thread, which proxies to mojo. Only on the reply
- // from mojo do we return from this.
- base::WaitableEvent done_event(false, false);
- task_runner()->PostTask(
- FROM_HERE, base::Bind(&LevelDBFileThread::CreateDirImpl, this,
- dir, path, &done_event, &error));
- done_event.Wait();
-
- return error;
-}
-
-filesystem::FileError LevelDBFileThread::GetFileSize(OpaqueDir* dir,
- const std::string& path,
- uint64_t* file_size) {
- DCHECK_NE(GetThreadId(), base::PlatformThread::CurrentId());
-
- filesystem::FileError error;
-
- // This proxies to the other thread, which proxies to mojo. Only on the reply
- // from mojo do we return from this.
- base::WaitableEvent done_event(false, false);
- task_runner()->PostTask(
- FROM_HERE, base::Bind(&LevelDBFileThread::GetFileSizeImpl, this,
- dir, path, file_size, &done_event, &error));
- done_event.Wait();
-
- return error;
-}
-
-filesystem::FileError LevelDBFileThread::RenameFile(
- OpaqueDir* dir,
- const std::string& old_path,
- const std::string& new_path) {
- DCHECK_NE(GetThreadId(), base::PlatformThread::CurrentId());
-
- filesystem::FileError error;
-
- // This proxies to the other thread, which proxies to mojo. Only on the reply
- // from mojo do we return from this.
- base::WaitableEvent done_event(false, false);
- task_runner()->PostTask(
- FROM_HERE, base::Bind(&LevelDBFileThread::RenameFileImpl, this,
- dir, old_path, new_path, &done_event, &error));
- done_event.Wait();
-
- return error;
-}
-
-std::pair<filesystem::FileError, LevelDBFileThread::OpaqueLock*>
-LevelDBFileThread::LockFile(OpaqueDir* dir,
- const std::string& path) {
- DCHECK_NE(GetThreadId(), base::PlatformThread::CurrentId());
-
- filesystem::FileError error;
- OpaqueLock* out_lock = nullptr;
-
- // This proxies to the other thread, which proxies to mojo. Only on the reply
- // from mojo do we return from this.
- base::WaitableEvent done_event(false, false);
- task_runner()->PostTask(
- FROM_HERE, base::Bind(&LevelDBFileThread::LockFileImpl, this,
- dir, path, &done_event, &error, &out_lock));
- done_event.Wait();
-
- return std::make_pair(error, out_lock);
-}
-
-filesystem::FileError LevelDBFileThread::UnlockFile(OpaqueLock* lock) {
- DCHECK_NE(GetThreadId(), base::PlatformThread::CurrentId());
-
- // Take ownership of the incoming lock so it gets destroyed whatever happens.
- scoped_ptr<OpaqueLock> scoped_lock(lock);
-
- filesystem::FileError error;
-
- // This proxies to the other thread, which proxies to mojo. Only on the reply
- // from mojo do we return from this.
- base::WaitableEvent done_event(false, false);
- task_runner()->PostTask(
- FROM_HERE, base::Bind(&LevelDBFileThread::UnlockFileImpl, this,
- base::Passed(&scoped_lock), &done_event, &error));
- done_event.Wait();
-
- return error;
-}
-
-LevelDBFileThread::~LevelDBFileThread() {
- Stop();
- DCHECK_EQ(0, outstanding_opaque_dirs_);
-}
-
-bool LevelDBFileThread::RegisterDirAndWaitableEvent(
- OpaqueDir* dir,
- base::WaitableEvent* done_event) {
- if (!dir->directory.is_bound()) {
- // The directory went out of scope between the PostTask on the other thread
- // and now.
- done_event->Signal();
- return true;
- }
-
- waitable_event_dependencies_[done_event].directories.insert(&dir->directory);
- return false;
-}
-
-void LevelDBFileThread::CompleteWaitableEvent(base::WaitableEvent* done_event) {
- // Clean up the dependencies that we no longer care about.
- waitable_event_dependencies_.erase(done_event);
- done_event->Signal();
-}
-
-void LevelDBFileThread::OnConnectionError() {
- // One of our interface ptrs has become unbound. Signal the event which has
- // it as a dependency.
- auto it = waitable_event_dependencies_.begin();
- while (it != waitable_event_dependencies_.end()) {
- bool unbound_ptr_found = false;
- for (const auto* dir : it->second.directories) {
- if (!dir->is_bound()) {
- unbound_ptr_found = true;
- break;
- }
- }
-
- if (!unbound_ptr_found) {
- for (const auto* file : it->second.files) {
- if (!file->is_bound()) {
- unbound_ptr_found = true;
- break;
- }
- }
- }
-
- if (unbound_ptr_found) {
- base::WaitableEvent* e = it->first;
- it = waitable_event_dependencies_.erase(it);
- e->Signal();
- } else {
- ++it;
- }
- }
-}
-
-void LevelDBFileThread::OnSimpleComplete(base::WaitableEvent* done_event,
- filesystem::FileError* out_error,
- filesystem::FileError in_error) {
- DCHECK_EQ(GetThreadId(), base::PlatformThread::CurrentId());
- *out_error = in_error;
- CompleteWaitableEvent(done_event);
-}
-
-void LevelDBFileThread::RegisterDirectoryImpl(
- base::WaitableEvent* done_event,
- mojo::InterfacePtrInfo<filesystem::Directory> directory_info,
- OpaqueDir** out_dir) {
- DCHECK_EQ(GetThreadId(), base::PlatformThread::CurrentId());
-
- // Take the Directory pipe and bind it on this thread.
- *out_dir = new OpaqueDir(std::move(directory_info));
- outstanding_opaque_dirs_++;
-
- // Register the connection error handler for the resulting DirectoryPtr
- (*out_dir)->directory.set_connection_error_handler(
- base::Bind(&LevelDBFileThread::OnConnectionError, this));
-
- done_event->Signal();
-}
-
-void LevelDBFileThread::UnregisterDirectoryImpl(
- base::WaitableEvent* done_event,
- OpaqueDir* dir) {
- // Only delete the directories on the thread that owns them.
- delete dir;
- outstanding_opaque_dirs_--;
- CompleteWaitableEvent(done_event);
-}
-
-void LevelDBFileThread::OpenFileHandleImpl(OpaqueDir* dir,
- std::string name,
- base::WaitableEvent* done_event,
- uint32_t open_flags,
- base::File* out_file) {
- DCHECK_EQ(GetThreadId(), base::PlatformThread::CurrentId());
-
- if (RegisterDirAndWaitableEvent(dir, done_event))
- return;
-
- dir->directory->OpenFileHandle(
- mojo::String::From(name), open_flags,
- base::Bind(&LevelDBFileThread::OnOpenFileHandleComplete, this, done_event,
- out_file));
-}
-
-void LevelDBFileThread::OnOpenFileHandleComplete(
- base::WaitableEvent* done_event,
- base::File* output_file,
- filesystem::FileError err,
- mojo::ScopedHandle handle) {
- DCHECK_EQ(GetThreadId(), base::PlatformThread::CurrentId());
-
- if (err != filesystem::FileError::OK) {
- *output_file = base::File(static_cast<base::File::Error>(err));
- } else {
- MojoPlatformHandle platform_handle;
- MojoResult extract_result =
- MojoExtractPlatformHandle(handle.release().value(), &platform_handle);
-
- if (extract_result == MOJO_RESULT_OK) {
- *output_file = base::File(platform_handle);
- } else {
- NOTREACHED();
- *output_file = base::File(base::File::Error::FILE_ERROR_FAILED);
- }
- }
-
- CompleteWaitableEvent(done_event);
-}
-
-void LevelDBFileThread::SyncDirectoryImpl(OpaqueDir* dir,
- std::string name,
- base::WaitableEvent* done_event,
- filesystem::FileError* out_error) {
- DCHECK_EQ(GetThreadId(), base::PlatformThread::CurrentId());
-
- if (RegisterDirAndWaitableEvent(dir, done_event))
- return;
-
- // Step one: open the directory |name| from the toplevel directory.
- scoped_ptr<filesystem::DirectoryPtr> target(new filesystem::DirectoryPtr);
-
- dir->directory->OpenDirectory(
- name, GetProxy(target.get()),
- filesystem::kFlagRead | filesystem::kFlagWrite,
- base::Bind(&LevelDBFileThread::OnSyncDirctoryOpened, this,
- base::Passed(&target), done_event, out_error));
-}
-
-void LevelDBFileThread::OnSyncDirctoryOpened(
- scoped_ptr<filesystem::DirectoryPtr> dir,
- base::WaitableEvent* done_event,
- filesystem::FileError* out_error,
- filesystem::FileError in_error) {
- DCHECK_EQ(GetThreadId(), base::PlatformThread::CurrentId());
-
- if (in_error != filesystem::FileError::OK) {
- *out_error = in_error;
- CompleteWaitableEvent(done_event);
- return;
- }
-
- // Add a dependency between the new directory we opened and the current
- // waitable event.
- dir->set_connection_error_handler(
- base::Bind(&LevelDBFileThread::OnConnectionError, this));
- waitable_event_dependencies_[done_event].directories.insert(dir.get());
-
- // We move the object into the bind before we call. Copy to the stack.
- filesystem::DirectoryPtr* local = dir.get();
- (*local)->Flush(base::Bind(&LevelDBFileThread::OnSyncDirectoryComplete, this,
- base::Passed(&dir), done_event, out_error));
-}
-
-void LevelDBFileThread::OnSyncDirectoryComplete(
- scoped_ptr<filesystem::DirectoryPtr> dir,
- base::WaitableEvent* done_event,
- filesystem::FileError* out_error,
- filesystem::FileError in_error) {
- DCHECK_EQ(GetThreadId(), base::PlatformThread::CurrentId());
- *out_error = in_error;
- CompleteWaitableEvent(done_event);
-}
-
-void LevelDBFileThread::FileExistsImpl(OpaqueDir* dir,
- std::string name,
- base::WaitableEvent* done_event,
- bool* exists) {
- DCHECK_EQ(GetThreadId(), base::PlatformThread::CurrentId());
-
- if (RegisterDirAndWaitableEvent(dir, done_event))
- return;
-
- dir->directory->Exists(
- mojo::String::From(name),
- base::Bind(&LevelDBFileThread::OnFileExistsComplete, this,
- done_event, exists));
-}
-
-void LevelDBFileThread::OnFileExistsComplete(base::WaitableEvent* done_event,
- bool* exists,
- filesystem::FileError err,
- bool in_exists) {
- DCHECK_EQ(GetThreadId(), base::PlatformThread::CurrentId());
- *exists = in_exists;
- CompleteWaitableEvent(done_event);
-}
-
-void LevelDBFileThread::GetChildrenImpl(OpaqueDir* dir,
- std::string name,
- std::vector<std::string>* contents,
- base::WaitableEvent* done_event,
- filesystem::FileError* out_error) {
- DCHECK_EQ(GetThreadId(), base::PlatformThread::CurrentId());
-
- if (RegisterDirAndWaitableEvent(dir, done_event))
- return;
-
- // Step one: open the directory |name| from the toplevel directory.
- scoped_ptr<filesystem::DirectoryPtr> target(new filesystem::DirectoryPtr);
- mojo::InterfaceRequest<filesystem::Directory> proxy = GetProxy(target.get());
- dir->directory->OpenDirectory(
- name, std::move(proxy), filesystem::kFlagRead | filesystem::kFlagWrite,
- base::Bind(&LevelDBFileThread::OnGetChildrenOpened, this,
- base::Passed(&target), contents, done_event, out_error));
-}
-
-void LevelDBFileThread::OnGetChildrenOpened(
- scoped_ptr<filesystem::DirectoryPtr> dir,
- std::vector<std::string>* contents,
- base::WaitableEvent* done_event,
- filesystem::FileError* out_error,
- filesystem::FileError in_error) {
- DCHECK_EQ(GetThreadId(), base::PlatformThread::CurrentId());
-
- if (in_error != filesystem::FileError::OK) {
- *out_error = in_error;
- CompleteWaitableEvent(done_event);
- return;
- }
-
- // Add a dependency between the new directory we opened and the current
- // waitable event.
- dir->set_connection_error_handler(
- base::Bind(&LevelDBFileThread::OnConnectionError, this));
- waitable_event_dependencies_[done_event].directories.insert(dir.get());
-
- // We move the object into the bind before we call. Copy to the stack.
- filesystem::DirectoryPtr* local = dir.get();
- (*local)->Read(base::Bind(&LevelDBFileThread::OnGetChildrenComplete, this,
- base::Passed(&dir), contents, done_event,
- out_error));
-}
-
-void LevelDBFileThread::OnGetChildrenComplete(
- scoped_ptr<filesystem::DirectoryPtr> dir,
- std::vector<std::string>* out_contents,
- base::WaitableEvent* done_event,
- filesystem::FileError* out_error,
- filesystem::FileError in_error,
- mojo::Array<filesystem::DirectoryEntryPtr> directory_contents) {
- DCHECK_EQ(GetThreadId(), base::PlatformThread::CurrentId());
-
- if (!directory_contents.is_null()) {
- for (size_t i = 0; i < directory_contents.size(); ++i)
- out_contents->push_back(directory_contents[i]->name.To<std::string>());
- }
-
- *out_error = in_error;
- CompleteWaitableEvent(done_event);
-}
-
-void LevelDBFileThread::DeleteImpl(OpaqueDir* dir,
- std::string name,
- uint32_t delete_flags,
- base::WaitableEvent* done_event,
- filesystem::FileError* out_error) {
- DCHECK_EQ(GetThreadId(), base::PlatformThread::CurrentId());
-
- if (RegisterDirAndWaitableEvent(dir, done_event))
- return;
-
- dir->directory->Delete(mojo::String::From(name), delete_flags,
- base::Bind(&LevelDBFileThread::OnSimpleComplete, this,
- done_event, out_error));
-}
-
-void LevelDBFileThread::CreateDirImpl(OpaqueDir* dir,
- std::string name,
- base::WaitableEvent* done_event,
- filesystem::FileError* out_error) {
- DCHECK_EQ(GetThreadId(), base::PlatformThread::CurrentId());
-
- if (RegisterDirAndWaitableEvent(dir, done_event))
- return;
-
- dir->directory->OpenDirectory(
- name, nullptr,
- filesystem::kFlagRead | filesystem::kFlagWrite | filesystem::kFlagCreate,
- base::Bind(&LevelDBFileThread::OnSimpleComplete, this, done_event,
- out_error));
-}
-
-void LevelDBFileThread::GetFileSizeImpl(OpaqueDir* dir,
- const std::string& path,
- uint64_t* file_size,
- base::WaitableEvent* done_event,
- filesystem::FileError* out_error) {
- DCHECK_EQ(GetThreadId(), base::PlatformThread::CurrentId());
-
- if (RegisterDirAndWaitableEvent(dir, done_event))
- return;
-
- dir->directory->StatFile(
- path, base::Bind(&LevelDBFileThread::OnGetFileSizeImpl, this, file_size,
- done_event, out_error));
-}
-
-void LevelDBFileThread::OnGetFileSizeImpl(
- uint64_t* file_size,
- base::WaitableEvent* done_event,
- filesystem::FileError* out_error,
- filesystem::FileError in_error,
- filesystem::FileInformationPtr file_info) {
- DCHECK_EQ(GetThreadId(), base::PlatformThread::CurrentId());
- if (file_info)
- *file_size = file_info->size;
- *out_error = in_error;
- CompleteWaitableEvent(done_event);
-}
-
-void LevelDBFileThread::RenameFileImpl(OpaqueDir* dir,
- const std::string& old_path,
- const std::string& new_path,
- base::WaitableEvent* done_event,
- filesystem::FileError* out_error) {
- DCHECK_EQ(GetThreadId(), base::PlatformThread::CurrentId());
-
- if (RegisterDirAndWaitableEvent(dir, done_event))
- return;
-
- dir->directory->Rename(mojo::String::From(old_path),
- mojo::String::From(new_path),
- base::Bind(&LevelDBFileThread::OnSimpleComplete, this,
- done_event, out_error));
-}
-
-void LevelDBFileThread::LockFileImpl(OpaqueDir* dir,
- const std::string& path,
- base::WaitableEvent* done_event,
- filesystem::FileError* out_error,
- OpaqueLock** out_lock) {
- DCHECK_EQ(GetThreadId(), base::PlatformThread::CurrentId());
-
- if (RegisterDirAndWaitableEvent(dir, done_event))
- return;
-
- // Since a lock is associated with a file descriptor, we need to open and
- // have a persistent file on the other side of the connection.
- scoped_ptr<filesystem::FilePtr> target(new filesystem::FilePtr);
- mojo::InterfaceRequest<filesystem::File> proxy = GetProxy(target.get());
- dir->directory->OpenFile(
- mojo::String::From(path), std::move(proxy),
- filesystem::kFlagOpenAlways | filesystem::kFlagRead |
- filesystem::kFlagWrite,
- base::Bind(&LevelDBFileThread::OnOpenLockFileComplete, this,
- base::Passed(&target), done_event, out_error, out_lock));
-}
-
-void LevelDBFileThread::OnOpenLockFileComplete(
- scoped_ptr<filesystem::FilePtr> file,
- base::WaitableEvent* done_event,
- filesystem::FileError* out_error,
- OpaqueLock** out_lock,
- filesystem::FileError in_error) {
- DCHECK_EQ(GetThreadId(), base::PlatformThread::CurrentId());
-
- if (in_error != filesystem::FileError::OK) {
- *out_error = in_error;
- CompleteWaitableEvent(done_event);
- return;
- }
-
- // Add a dependency between the new file we opened and the current waitable
- // event. (This dependency will get cleared in OnLockFileComplete if we
- // complete this call safely.)
- file->set_connection_error_handler(
- base::Bind(&LevelDBFileThread::OnConnectionError, this));
- waitable_event_dependencies_[done_event].files.insert(file.get());
-
- filesystem::FilePtr* local = file.get();
- (*local)->Lock(base::Bind(&LevelDBFileThread::OnLockFileComplete, this,
- base::Passed(&file), done_event, out_error,
- out_lock));
-}
-
-void LevelDBFileThread::OnLockFileComplete(scoped_ptr<filesystem::FilePtr> file,
- base::WaitableEvent* done_event,
- filesystem::FileError* out_error,
- OpaqueLock** out_lock,
- filesystem::FileError in_error) {
- DCHECK_EQ(GetThreadId(), base::PlatformThread::CurrentId());
-
- *out_error = in_error;
-
- if (in_error == filesystem::FileError::OK) {
- OpaqueLock* l = new OpaqueLock;
- l->lock_file = std::move(*file);
- *out_lock = l;
- }
-
- CompleteWaitableEvent(done_event);
-}
-
-void LevelDBFileThread::UnlockFileImpl(scoped_ptr<OpaqueLock> lock,
- base::WaitableEvent* done_event,
- filesystem::FileError* out_error) {
- DCHECK_EQ(GetThreadId(), base::PlatformThread::CurrentId());
-
- OpaqueLock* local = lock.get();
- local->lock_file->Unlock(base::Bind(&LevelDBFileThread::OnUnlockFileCompleted,
- this, base::Passed(&lock), done_event,
- out_error));
-}
-
-void LevelDBFileThread::OnUnlockFileCompleted(scoped_ptr<OpaqueLock> lock,
- base::WaitableEvent* done_event,
- filesystem::FileError* out_error,
- filesystem::FileError in_error) {
- // We're passed the OpauqeLock here for ownership reasons, but it's going to
- // get destructed on its own here.
- DCHECK_EQ(GetThreadId(), base::PlatformThread::CurrentId());
- *out_error = in_error;
- CompleteWaitableEvent(done_event);
-}
-
-void LevelDBFileThread::Init() {
-}
-
-void LevelDBFileThread::CleanUp() {
-}
-
-} // namespace leveldb
« no previous file with comments | « components/leveldb/leveldb_file_thread.h ('k') | components/leveldb/leveldb_mojo_proxy.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698