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.
This commit is contained in:
parent
e29e076ab8
commit
61edd21fa4
3 changed files with 22 additions and 1 deletions
|
@ -1,5 +1,14 @@
|
|||
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
|
||||
* output.cc (Output_section::find_starting_output_address): Rename
|
||||
from starting_output_address; add PADDR parameter; change return
|
||||
|
|
|
@ -75,6 +75,12 @@ Descriptors::open(int descriptor, const char* name, int flags, int mode)
|
|||
{
|
||||
gold_assert(!pod->inuse);
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
@ -114,6 +120,7 @@ Descriptors::open(int descriptor, const char* name, int flags, int mode)
|
|||
pod->stack_next = -1;
|
||||
pod->inuse = true;
|
||||
pod->is_write = (flags & O_ACCMODE) != O_RDONLY;
|
||||
pod->is_on_stack = false;
|
||||
|
||||
++this->current_;
|
||||
if (this->current_ >= this->limit_)
|
||||
|
@ -158,10 +165,11 @@ Descriptors::release(int descriptor, bool permanent)
|
|||
else
|
||||
{
|
||||
pod->inuse = false;
|
||||
if (!pod->is_write)
|
||||
if (!pod->is_write && !pod->is_on_stack)
|
||||
{
|
||||
pod->stack_next = this->stack_top_;
|
||||
this->stack_top_ = descriptor;
|
||||
pod->is_on_stack = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -193,6 +201,8 @@ Descriptors::close_some_descriptor()
|
|||
this->stack_top_ = pod->stack_next;
|
||||
else
|
||||
this->open_descriptors_[last].stack_next = pod->stack_next;
|
||||
pod->stack_next = -1;
|
||||
pod->is_on_stack = false;
|
||||
return true;
|
||||
}
|
||||
last = i;
|
||||
|
|
|
@ -69,6 +69,8 @@ class Descriptors
|
|||
bool inuse;
|
||||
// Whether this is a write descriptor.
|
||||
bool is_write;
|
||||
// Whether the descriptor is on the stack.
|
||||
bool is_on_stack;
|
||||
};
|
||||
|
||||
bool
|
||||
|
|
Loading…
Reference in a new issue