[binutils-gdb] gold: Avoid sharing Plugin_list::iterator

H.J. Lu hjl@sourceware.org
Sun Nov 8 12:14:20 GMT 2020


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=d4820dac5e7608e24fba6d08cde9248b4c4b2928

commit d4820dac5e7608e24fba6d08cde9248b4c4b2928
Author: H.J. Lu <hjl.tools@gmail.com>
Date:   Sun Nov 8 04:10:01 2020 -0800

    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.

Diff:
---
 gold/ChangeLog |  8 ++++++++
 gold/plugin.cc | 34 +++++++++++++++++-----------------
 2 files changed, 25 insertions(+), 17 deletions(-)

diff --git a/gold/ChangeLog b/gold/ChangeLog
index 73a74190511..cb2ad727067 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 8963c7fa4c8..729ddca9f31 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


More information about the Binutils-cvs mailing list