mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-08-06 06:45:56 +08:00
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:
@ -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;
|
||||
|
Reference in New Issue
Block a user