diff --git a/gold/ChangeLog b/gold/ChangeLog index 4901215b1a..5c719fc634 100644 --- a/gold/ChangeLog +++ b/gold/ChangeLog @@ -1,3 +1,8 @@ +2014-11-06 Evgeniy Dushistov + + * plugin.cc: use lock to searialize calls of Plugin_manager::claim_file + * plugin.h: add lock definition + 2014-10-29 Han Shen Jing Yu diff --git a/gold/plugin.cc b/gold/plugin.cc index 0339d4289d..4b0f3cfb01 100644 --- a/gold/plugin.cc +++ b/gold/plugin.cc @@ -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; diff --git a/gold/plugin.h b/gold/plugin.h index 9ef2812909..f27f98dbdd 100644 --- a/gold/plugin.h +++ b/gold/plugin.h @@ -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_; };