diff options
author | H.J. Lu <hjl.tools@gmail.com> | 2020-11-08 04:10:01 -0800 |
---|---|---|
committer | H.J. Lu <hjl.tools@gmail.com> | 2020-11-08 04:10:15 -0800 |
commit | d4820dac5e7608e24fba6d08cde9248b4c4b2928 (patch) | |
tree | e679864fec0c2c99baf9f1f2cab0ad3ac2f60666 /gold | |
parent | a907d563de51b5288a7acae8df805428cc1b960d (diff) | |
download | gdb-d4820dac5e7608e24fba6d08cde9248b4c4b2928.zip gdb-d4820dac5e7608e24fba6d08cde9248b4c4b2928.tar.gz gdb-d4820dac5e7608e24fba6d08cde9248b4c4b2928.tar.bz2 |
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.
Diffstat (limited to 'gold')
-rw-r--r-- | gold/ChangeLog | 8 | ||||
-rw-r--r-- | 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 <hongjiu.lu@intel.com> + + 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 <amodra@gmail.com> * 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 |