From: Evgeniy Dushistov Date: Sat, 8 Nov 2014 00:12:58 +0000 (-0800) Subject: Fix race condition when using --threads with linker plugins. X-Git-Tag: gdb-7.9.0-release~705 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=d37ffe2537a2ec5a22abfaad316a640a40cccda1;p=external%2Fbinutils.git Fix race condition when using --threads with linker plugins. 2014-11-06 Evgeniy Dushistov gold/ * plugin.cc: use lock to searialize calls of Plugin_manager::claim_file * plugin.h: add lock definition --- diff --git a/gold/ChangeLog b/gold/ChangeLog index 4901215..5c719fc 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 0339d42..4b0f3cf 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 9ef2812..f27f98d 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_; };