aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEvgeniy Dushistov <dushistov@mail.ru>2014-11-07 16:12:58 -0800
committerCary Coutant <ccoutant@google.com>2014-11-07 16:12:58 -0800
commitd37ffe2537a2ec5a22abfaad316a640a40cccda1 (patch)
tree98f069f1e66350e7afa5383a91ecc46a667c1d6a
parent8ee35f2ab5f91c7a558009ff9ba341dc7133ef4c (diff)
downloadgdb-d37ffe2537a2ec5a22abfaad316a640a40cccda1.zip
gdb-d37ffe2537a2ec5a22abfaad316a640a40cccda1.tar.gz
gdb-d37ffe2537a2ec5a22abfaad316a640a40cccda1.tar.bz2
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
-rw-r--r--gold/ChangeLog5
-rw-r--r--gold/plugin.cc5
-rw-r--r--gold/plugin.h5
3 files changed, 14 insertions, 1 deletions
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 <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>
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_;
};