* descriptors.h (Open_descriptor): Add is_on_stack field.
	* descriptors.cc (Descriptors::open): If the descriptor is on the
	top of the stack, remove it.  Initialize is_on_stack field.
	(Descriptors::release): Only add pod to stack if it is not on the
	stack already.
	(Descriptors::close_some_descriptor): Clear stack_next and
	is_on_stack fields.
This commit is contained in:
Ian Lance Taylor
2009-02-28 03:05:08 +00:00
parent e29e076ab8
commit 61edd21fa4
3 changed files with 22 additions and 1 deletions

View File

@ -1,5 +1,14 @@
2009-02-27 Ian Lance Taylor <iant@google.com> 2009-02-27 Ian Lance Taylor <iant@google.com>
PR 5990
* descriptors.h (Open_descriptor): Add is_on_stack field.
* descriptors.cc (Descriptors::open): If the descriptor is on the
top of the stack, remove it. Initialize is_on_stack field.
(Descriptors::release): Only add pod to stack if it is not on the
stack already.
(Descriptors::close_some_descriptor): Clear stack_next and
is_on_stack fields.
PR 7091 PR 7091
* output.cc (Output_section::find_starting_output_address): Rename * output.cc (Output_section::find_starting_output_address): Rename
from starting_output_address; add PADDR parameter; change return from starting_output_address; add PADDR parameter; change return

View File

@ -75,6 +75,12 @@ Descriptors::open(int descriptor, const char* name, int flags, int mode)
{ {
gold_assert(!pod->inuse); gold_assert(!pod->inuse);
pod->inuse = true; pod->inuse = true;
if (descriptor == this->stack_top_)
{
this->stack_top_ = pod->stack_next;
pod->stack_next = -1;
pod->is_on_stack = false;
}
return descriptor; return descriptor;
} }
} }
@ -114,6 +120,7 @@ Descriptors::open(int descriptor, const char* name, int flags, int mode)
pod->stack_next = -1; pod->stack_next = -1;
pod->inuse = true; pod->inuse = true;
pod->is_write = (flags & O_ACCMODE) != O_RDONLY; pod->is_write = (flags & O_ACCMODE) != O_RDONLY;
pod->is_on_stack = false;
++this->current_; ++this->current_;
if (this->current_ >= this->limit_) if (this->current_ >= this->limit_)
@ -158,10 +165,11 @@ Descriptors::release(int descriptor, bool permanent)
else else
{ {
pod->inuse = false; pod->inuse = false;
if (!pod->is_write) if (!pod->is_write && !pod->is_on_stack)
{ {
pod->stack_next = this->stack_top_; pod->stack_next = this->stack_top_;
this->stack_top_ = descriptor; this->stack_top_ = descriptor;
pod->is_on_stack = true;
} }
} }
} }
@ -193,6 +201,8 @@ Descriptors::close_some_descriptor()
this->stack_top_ = pod->stack_next; this->stack_top_ = pod->stack_next;
else else
this->open_descriptors_[last].stack_next = pod->stack_next; this->open_descriptors_[last].stack_next = pod->stack_next;
pod->stack_next = -1;
pod->is_on_stack = false;
return true; return true;
} }
last = i; last = i;

View File

@ -69,6 +69,8 @@ class Descriptors
bool inuse; bool inuse;
// Whether this is a write descriptor. // Whether this is a write descriptor.
bool is_write; bool is_write;
// Whether the descriptor is on the stack.
bool is_on_stack;
}; };
bool bool