[PATCH] gold: Avoid sharing Plugin_list::iterator
H.J. Lu
hjl.tools@gmail.com
Thu Nov 5 14:07:55 GMT 2020
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/plugin.cc | 34 +++++++++++++++++-----------------
1 file changed, 17 insertions(+), 17 deletions(-)
diff --git a/gold/plugin.cc b/gold/plugin.cc
index 8963c7fa4c..729ddca9f3 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
--
2.28.0
More information about the Binutils
mailing list