Fix race condition when using --threads with linker plugins.

2014-11-06  Evgeniy Dushistov  <dushistov@mail.ru>

gold/
	* plugin.cc: use lock to searialize calls of Plugin_manager::claim_file
	* plugin.h: add lock definition
This commit is contained in:
Evgeniy Dushistov 2014-11-07 16:12:58 -08:00 committed by Cary Coutant
parent 8ee35f2ab5
commit d37ffe2537
3 changed files with 14 additions and 1 deletions

View file

@ -1,3 +1,8 @@
2014-11-06 Evgeniy Dushistov <dushistov@mail.ru>
* plugin.cc: use lock to searialize calls of Plugin_manager::claim_file
* plugin.h: add lock definition
2014-10-29 Han Shen <shenhan@google.com>
Jing Yu <jingyu@google.com>

View file

@ -427,6 +427,7 @@ Plugin_manager::~Plugin_manager()
++obj)
delete *obj;
this->objects_.clear();
delete this->lock_;
}
// Load all plugin libraries.
@ -447,6 +448,10 @@ Pluginobj*
Plugin_manager::claim_file(Input_file* input_file, off_t offset,
off_t filesize, Object* elf_object)
{
bool lock_initialized = this->initialize_lock_.initialize();
gold_assert(lock_initialized);
Hold_lock hl(*this->lock_);
if (this->in_replacement_phase_)
return NULL;

View file

@ -134,7 +134,8 @@ class Plugin_manager
in_claim_file_handler_(false),
options_(options), workqueue_(NULL), task_(NULL), input_objects_(NULL),
symtab_(NULL), layout_(NULL), dirpath_(NULL), mapfile_(NULL),
this_blocker_(NULL), extra_search_path_()
this_blocker_(NULL), extra_search_path_(), lock_(NULL),
initialize_lock_(&lock_)
{ this->current_ = plugins_.end(); }
~Plugin_manager();
@ -376,6 +377,8 @@ class Plugin_manager
// An extra directory to seach for the libraries passed by
// add_input_library.
std::string extra_search_path_;
Lock* lock_;
Initialize_lock initialize_lock_;
};