From d4820dac5e7608e24fba6d08cde9248b4c4b2928 Mon Sep 17 00:00:00 2001 From: "H.J. Lu" Date: Sun, 8 Nov 2020 04:10:01 -0800 Subject: gold: Avoid sharing Plugin_list::iterator class Plugin_manager has // A pointer to the current plugin. Used while loading plugins. Plugin_list::iterator current_; The same iterator is shared by all threads. It is OK to use it to load plugins since only one thread loads plugins. Avoid sharing Plugin_list iterator in all other cases. PR gold/26200 * plugin.cc (Plugin_manager::claim_file): Don't share Plugin_list iterator. (Plugin_manager::all_symbols_read): Likewise. (Plugin_manager::cleanup): Likewise. --- gold/ChangeLog | 8 ++++++++ gold/plugin.cc | 34 +++++++++++++++++----------------- 2 files changed, 25 insertions(+), 17 deletions(-) diff --git a/gold/ChangeLog b/gold/ChangeLog index 73a7419..cb2ad72 100644 --- a/gold/ChangeLog +++ b/gold/ChangeLog @@ -1,3 +1,11 @@ +2020-11-08 H.J. Lu + + PR gold/26200 + * plugin.cc (Plugin_manager::claim_file): Don't share Plugin_list + iterator. + (Plugin_manager::all_symbols_read): Likewise. + (Plugin_manager::cleanup): Likewise. + 2020-11-03 Alan Modra * powerpc.cc (Target_powerpc::tocsave_loc): Return a pointer. diff --git a/gold/plugin.cc b/gold/plugin.cc index 8963c7f..729ddca 100644 --- a/gold/plugin.cc +++ b/gold/plugin.cc @@ -755,17 +755,17 @@ Plugin_manager::claim_file(Input_file* input_file, off_t offset, this->objects_.push_back(elf_object); this->in_claim_file_handler_ = true; - for (this->current_ = this->plugins_.begin(); - this->current_ != this->plugins_.end(); - ++this->current_) + for (Plugin_list::iterator p = this->plugins_.begin(); + p != this->plugins_.end(); + ++p) { // If we aren't yet in replacement phase, allow plugins to claim input // files, otherwise notify the plugin of the new input file, if needed. if (!this->in_replacement_phase_) - { - if ((*this->current_)->claim_file(&this->plugin_input_file_)) - { - this->any_claimed_ = true; + { + if ((*p)->claim_file(&this->plugin_input_file_)) + { + this->any_claimed_ = true; this->in_claim_file_handler_ = false; if (this->recorder_ != NULL) @@ -775,7 +775,7 @@ Plugin_manager::claim_file(Input_file* input_file, off_t offset, : elf_object->name()); this->recorder_->claimed_file(objname, offset, filesize, - (*this->current_)->filename()); + (*p)->filename()); } if (this->objects_.size() > handle @@ -790,7 +790,7 @@ Plugin_manager::claim_file(Input_file* input_file, off_t offset, } else { - (*this->current_)->new_input(&this->plugin_input_file_); + (*p)->new_input(&this->plugin_input_file_); } } @@ -850,10 +850,10 @@ Plugin_manager::all_symbols_read(Workqueue* workqueue, Task* task, layout->script_options()->set_defsym_uses_in_real_elf(symtab); layout->script_options()->find_defsym_defs(this->defsym_defines_set_); - for (this->current_ = this->plugins_.begin(); - this->current_ != this->plugins_.end(); - ++this->current_) - (*this->current_)->all_symbols_read(); + for (Plugin_list::iterator p = this->plugins_.begin(); + p != this->plugins_.end(); + ++p) + (*p)->all_symbols_read(); if (this->any_added_) { @@ -1028,10 +1028,10 @@ Plugin_manager::cleanup() close_all_descriptors(); } - for (this->current_ = this->plugins_.begin(); - this->current_ != this->plugins_.end(); - ++this->current_) - (*this->current_)->cleanup(); + for (Plugin_list::iterator p = this->plugins_.begin(); + p != this->plugins_.end(); + ++p) + (*p)->cleanup(); } // Make a new Pluginobj object. This is called when the plugin calls -- cgit v1.1