GN: Use std::unique_ptr for owning pointers in InputFileManager. BUG=602726 Review URL: https://codereview.chromium.org/1877253003 Cr-Original-Commit-Position: refs/heads/master@{#388022} Cr-Mirrored-From: https://chromium.googlesource.com/chromium/src Cr-Mirrored-Commit: 959ec4e4802a64b022d7101eafbc791a0339e971
diff --git a/tools/gn/input_file_manager.cc b/tools/gn/input_file_manager.cc index a3e6460..36c0bf3 100644 --- a/tools/gn/input_file_manager.cc +++ b/tools/gn/input_file_manager.cc
@@ -94,9 +94,6 @@ InputFileManager::~InputFileManager() { // Should be single-threaded by now. - STLDeleteContainerPairSecondPointers(input_files_.begin(), - input_files_.end()); - STLDeleteContainerPointers(dynamic_inputs_.begin(), dynamic_inputs_.end()); } bool InputFileManager::AsyncLoadFile(const LocationRange& origin, @@ -114,18 +111,18 @@ InputFileMap::const_iterator found = input_files_.find(file_name); if (found == input_files_.end()) { // New file, schedule load. - InputFileData* data = new InputFileData(file_name); + std::unique_ptr<InputFileData> data(new InputFileData(file_name)); data->scheduled_callbacks.push_back(callback); - input_files_[file_name] = data; - schedule_this = base::Bind(&InputFileManager::BackgroundLoadFile, this, origin, build_settings, file_name, &data->file); + input_files_[file_name] = std::move(data); + } else { - InputFileData* data = found->second; + InputFileData* data = found->second.get(); // Prevent mixing async and sync loads. See SyncLoadFile for discussion. if (data->sync_invocation) { @@ -167,16 +164,17 @@ InputFileMap::iterator found = input_files_.find(file_name); if (found == input_files_.end()) { // Haven't seen this file yet, start loading right now. - data = new InputFileData(file_name); + std::unique_ptr<InputFileData> new_data(new InputFileData(file_name)); + data = new_data.get(); data->sync_invocation = true; - input_files_[file_name] = data; + input_files_[file_name] = std::move(new_data); base::AutoUnlock unlock(lock_); if (!LoadFile(origin, build_settings, file_name, &data->file, err)) return nullptr; } else { // This file has either been loaded or is pending loading. - data = found->second; + data = found->second.get(); if (!data->sync_invocation) { // Don't allow mixing of sync and async loads. If an async load is @@ -231,14 +229,14 @@ InputFile** file, std::vector<Token>** tokens, std::unique_ptr<ParseNode>** parse_root) { - InputFileData* data = new InputFileData(name); - { - base::AutoLock lock(lock_); - dynamic_inputs_.push_back(data); - } + std::unique_ptr<InputFileData> data(new InputFileData(name)); *file = &data->file; *tokens = &data->tokens; *parse_root = &data->parsed_root; + { + base::AutoLock lock(lock_); + dynamic_inputs_.push_back(std::move(data)); + } } int InputFileManager::GetInputFileCount() const { @@ -286,7 +284,7 @@ base::AutoLock lock(lock_); DCHECK(input_files_.find(name) != input_files_.end()); - InputFileData* data = input_files_[name]; + InputFileData* data = input_files_[name].get(); data->loaded = true; if (success) { data->tokens.swap(tokens);
diff --git a/tools/gn/input_file_manager.h b/tools/gn/input_file_manager.h index ba055e2..dd16604 100644 --- a/tools/gn/input_file_manager.h +++ b/tools/gn/input_file_manager.h
@@ -137,7 +137,8 @@ mutable base::Lock lock_; // Maps repo-relative filenames to the corresponding owned pointer. - typedef base::hash_map<SourceFile, InputFileData*> InputFileMap; + typedef base::hash_map<SourceFile, std::unique_ptr<InputFileData>> + InputFileMap; InputFileMap input_files_; // Tracks all dynamic inputs. The data are holders for memory management @@ -146,9 +147,7 @@ // charge of the threadsafety requirements. // // See AddDynamicInput(). - // - // Owning pointers. - std::vector<InputFileData*> dynamic_inputs_; + std::vector<std::unique_ptr<InputFileData>> dynamic_inputs_; DISALLOW_COPY_AND_ASSIGN(InputFileManager); };