Fix the static cleanup mechanism introduced to the runtime_loader/libroot:
* Fixed wrong start and size used in the runtime_loader * Fixed off by one error in the matching loop of the cleanup hook * Make sure we successfully acquire the locking sem of the exit stack git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@23493 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -46,8 +46,10 @@ _exit_stack_lock()
|
|||||||
{
|
{
|
||||||
thread_id self = find_thread(NULL);
|
thread_id self = find_thread(NULL);
|
||||||
if (self != sExitStackInfo.lock_owner) {
|
if (self != sExitStackInfo.lock_owner) {
|
||||||
if (atomic_add(&sExitStackInfo.lock_count, 1) > 0)
|
if (atomic_add(&sExitStackInfo.lock_count, 1) > 0) {
|
||||||
acquire_sem(sExitStackInfo.lock);
|
while (acquire_sem(sExitStackInfo.lock) != B_OK)
|
||||||
|
;
|
||||||
|
}
|
||||||
sExitStackInfo.lock_owner = self;
|
sExitStackInfo.lock_owner = self;
|
||||||
}
|
}
|
||||||
sExitStackInfo.recursion_count++;
|
sExitStackInfo.recursion_count++;
|
||||||
@@ -75,7 +77,7 @@ _call_atexit_hooks_for_range(addr_t start, addr_t size)
|
|||||||
int32 insertIndex = -1;
|
int32 insertIndex = -1;
|
||||||
|
|
||||||
_exit_stack_lock();
|
_exit_stack_lock();
|
||||||
for (index = sExitStackInfo.stack_size - 1; index > 0; index--) {
|
for (index = sExitStackInfo.stack_size - 1; index >= 0; index--) {
|
||||||
addr_t function = (addr_t)sExitStackInfo.exit_stack[index];
|
addr_t function = (addr_t)sExitStackInfo.exit_stack[index];
|
||||||
if (function >= start && function < start + size) {
|
if (function >= start && function < start + size) {
|
||||||
(*sExitStackInfo.exit_stack[index])();
|
(*sExitStackInfo.exit_stack[index])();
|
||||||
|
|||||||
@@ -1460,7 +1460,7 @@ unload_library(image_id imageID, bool addOn)
|
|||||||
// call image fini here...
|
// call image fini here...
|
||||||
if (gRuntimeLoader.call_atexit_hooks_for_range) {
|
if (gRuntimeLoader.call_atexit_hooks_for_range) {
|
||||||
gRuntimeLoader.call_atexit_hooks_for_range(
|
gRuntimeLoader.call_atexit_hooks_for_range(
|
||||||
image->regions[0].start, image->regions[0].size);
|
image->regions[0].vmstart, image->regions[0].vmsize);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (image->term_routine)
|
if (image->term_routine)
|
||||||
|
|||||||
Reference in New Issue
Block a user