diff options
author | Ian Lance Taylor <ian@airs.com> | 2010-02-12 04:33:53 +0000 |
---|---|---|
committer | Ian Lance Taylor <ian@airs.com> | 2010-02-12 04:33:53 +0000 |
commit | 93ceb76464b573cae4b2f94d3dd36665b3174628 (patch) | |
tree | a1fac640449c18860dd884b8c05d6c4b22a7e9bd /gold/reloc.cc | |
parent | 37ec92403b4d32b349d239339a1b829cef29f2a2 (diff) | |
download | gdb-93ceb76464b573cae4b2f94d3dd36665b3174628.zip gdb-93ceb76464b573cae4b2f94d3dd36665b3174628.tar.gz gdb-93ceb76464b573cae4b2f94d3dd36665b3174628.tar.bz2 |
* gold.cc (queue_middle_gc_tasks): Use a separate blocker for each
Read_relocs task.
(queue_middle_tasks): Likewise, and also for Scan_relocs. Run
Allocate_commons_task first.
* reloc.cc (Read_relocs::run): Pass next_blocker_ down to next
task, rather than symtab_lock_.
(Gc_process_relocs::~Gc_process_relocs): New function.
(Gc_process_relocs::is_runnable): Check this_blocker_.
(Gc_process_relocs::locks): Use next_blocker_ rather than
blocker_.
(Scan_relocs::~Scan_relocs): New function.
(Scan_relocs::is_runnable): Check this_blocker_ rather than
symtab_lock_.
(Scan_relocs::locks): Drop symtab_lock_ and blocker_. Add
next_blocker_.
* reloc.h (class Read_relocs): Drop symtab_lock_ and blocker_
fields. Add this_blocker_ and next_blocker_ fields. Adjust
constructor accordingly.
(class Gc_process_relocs): Likewise.
(class Scan_relocs): Likewise.
* common.h (class Allocate_commons_task): Remove symtab_lock_
field, and corresponding constructor parameter.
* common.cc (Allocate_commons_tasK::is_runnable): Remove use of
symtab_lock_.
(Allocate_commons_task::locks): Likewise.
Diffstat (limited to 'gold/reloc.cc')
-rw-r--r-- | gold/reloc.cc | 38 |
1 files changed, 26 insertions, 12 deletions
diff --git a/gold/reloc.cc b/gold/reloc.cc index 858778e..0061059 100644 --- a/gold/reloc.cc +++ b/gold/reloc.cc @@ -1,6 +1,6 @@ // reloc.cc -- relocate input files for gold. -// Copyright 2006, 2007, 2008, 2009 Free Software Foundation, Inc. +// Copyright 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc. // Written by Ian Lance Taylor <iant@google.com>. // This file is part of gold. @@ -75,15 +75,15 @@ Read_relocs::run(Workqueue* workqueue) workqueue->queue_next(new Gc_process_relocs(this->symtab_, this->layout_, this->object_, rd, - this->symtab_lock_, - this->blocker_)); + this->this_blocker_, + this->next_blocker_)); } else { workqueue->queue_next(new Scan_relocs(this->symtab_, this->layout_, this->object_, rd, - this->symtab_lock_, - this->blocker_)); + this->this_blocker_, + this->next_blocker_)); } } @@ -97,13 +97,22 @@ Read_relocs::get_name() const // Gc_process_relocs methods. -// These tasks process the relocations read by Read_relocs and +Gc_process_relocs::~Gc_process_relocs() +{ + if (this->this_blocker_ != NULL) + delete this->this_blocker_; +} + +// These tasks process the relocations read by Read_relocs and // determine which sections are referenced and which are garbage. -// This task is done only when --gc-sections is used. +// This task is done only when --gc-sections is used. This is blocked +// by THIS_BLOCKER_. It unblocks NEXT_BLOCKER_. Task_token* Gc_process_relocs::is_runnable() { + if (this->this_blocker_ != NULL && this->this_blocker_->is_blocked()) + return this->this_blocker_; if (this->object_->is_locked()) return this->object_->token(); return NULL; @@ -113,7 +122,7 @@ void Gc_process_relocs::locks(Task_locker* tl) { tl->add(this, this->object_->token()); - tl->add(this, this->blocker_); + tl->add(this, this->next_blocker_); } void @@ -133,6 +142,12 @@ Gc_process_relocs::get_name() const // Scan_relocs methods. +Scan_relocs::~Scan_relocs() +{ + if (this->this_blocker_ != NULL) + delete this->this_blocker_; +} + // These tasks scan the relocations read by Read_relocs and mark up // the symbol table to indicate which relocations are required. We // use a lock on the symbol table to keep them from interfering with @@ -141,8 +156,8 @@ Gc_process_relocs::get_name() const Task_token* Scan_relocs::is_runnable() { - if (!this->symtab_lock_->is_writable()) - return this->symtab_lock_; + if (this->this_blocker_ != NULL && this->this_blocker_->is_blocked()) + return this->this_blocker_; if (this->object_->is_locked()) return this->object_->token(); return NULL; @@ -155,8 +170,7 @@ void Scan_relocs::locks(Task_locker* tl) { tl->add(this, this->object_->token()); - tl->add(this, this->symtab_lock_); - tl->add(this, this->blocker_); + tl->add(this, this->next_blocker_); } // Scan the relocs. |