Remove use of synchronization/lock in tools/gn/input_file_manager Change-Id: I7c24dffb23bb17eddb633bd76341fbea3c21934a Reviewed-on: https://gn-review.googlesource.com/1704 Reviewed-by: Brett Wilson <brettw@chromium.org> Commit-Queue: Scott Graham <scottmg@chromium.org>
diff --git a/tools/gn/input_file_manager.cc b/tools/gn/input_file_manager.cc index 5ac71f0..9fba45f 100644 --- a/tools/gn/input_file_manager.cc +++ b/tools/gn/input_file_manager.cc
@@ -18,6 +18,17 @@ namespace { +// The opposite of std::lock_guard. +struct ScopedUnlock { + ScopedUnlock(std::unique_lock<std::mutex>& lock) : lock_(lock) { + lock_.unlock(); + } + ~ScopedUnlock() { lock_.lock(); } + + private: + std::unique_lock<std::mutex>& lock_; +}; + void InvokeFileLoadCallback(const InputFileManager::FileLoadCallback& cb, const ParseNode* node) { cb.Run(node); @@ -102,7 +113,7 @@ // after we leave the lock. Task schedule_this; { - base::AutoLock lock(lock_); + std::lock_guard<std::mutex> lock(lock_); InputFileMap::const_iterator found = input_files_.find(file_name); if (found == input_files_.end()) { @@ -153,7 +164,7 @@ const BuildSettings* build_settings, const SourceFile& file_name, Err* err) { - base::AutoLock lock(lock_); + std::unique_lock<std::mutex> lock(lock_); InputFileData* data = nullptr; InputFileMap::iterator found = input_files_.find(file_name); @@ -165,7 +176,7 @@ data->sync_invocation = true; input_files_[file_name] = std::move(new_data); - base::AutoUnlock unlock(lock_); + ScopedUnlock unlock(lock); if (!LoadFile(origin, build_settings, file_name, &data->file, err)) return nullptr; } else { @@ -208,7 +219,7 @@ base::WaitableEvent::InitialState::NOT_SIGNALED); } { - base::AutoUnlock unlock(lock_); + ScopedUnlock unlock(lock); data->completion_event->Wait(); } // If there were multiple waiters on the same event, we now need to wake @@ -236,19 +247,19 @@ *tokens = &data->tokens; *parse_root = &data->parsed_root; { - base::AutoLock lock(lock_); + std::lock_guard<std::mutex> lock(lock_); dynamic_inputs_.push_back(std::move(data)); } } int InputFileManager::GetInputFileCount() const { - base::AutoLock lock(lock_); + std::lock_guard<std::mutex> lock(lock_); return static_cast<int>(input_files_.size()); } void InputFileManager::GetAllPhysicalInputFileNames( std::vector<base::FilePath>* result) const { - base::AutoLock lock(lock_); + std::lock_guard<std::mutex> lock(lock_); result->reserve(input_files_.size()); for (const auto& file : input_files_) { if (!file.second->file.physical_name().empty()) @@ -283,7 +294,7 @@ std::vector<FileLoadCallback> callbacks; { - base::AutoLock lock(lock_); + std::lock_guard<std::mutex> lock(lock_); DCHECK(input_files_.find(name) != input_files_.end()); InputFileData* data = input_files_[name].get();
diff --git a/tools/gn/input_file_manager.h b/tools/gn/input_file_manager.h index f4dc130..ea29651 100644 --- a/tools/gn/input_file_manager.h +++ b/tools/gn/input_file_manager.h
@@ -5,6 +5,7 @@ #ifndef TOOLS_GN_INPUT_FILE_MANAGER_H_ #define TOOLS_GN_INPUT_FILE_MANAGER_H_ +#include <mutex> #include <set> #include <unordered_map> #include <utility> @@ -14,7 +15,6 @@ #include "base/files/file_path.h" #include "base/macros.h" #include "base/memory/ref_counted.h" -#include "base/synchronization/lock.h" #include "base/synchronization/waitable_event.h" #include "tools/gn/build_settings.h" #include "tools/gn/input_file.h" @@ -134,7 +134,7 @@ InputFile* file, Err* err); - mutable base::Lock lock_; + mutable std::mutex lock_; // Maps repo-relative filenames to the corresponding owned pointer. typedef std::unordered_map<SourceFile, std::unique_ptr<InputFileData>>