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.
This commit is contained in:
parent
a907d563de
commit
d4820dac5e
@ -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.
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user