8c2a9d7433
As (our) gcc unfortunately uses atexit() to clean up lazily initialized static variables inside functions we have to ensure that we do the right thing with unloadable shared objects. In case a shared object was unloaded that installed an atexit() hook the application would crash on exit. We now implement a callback into libroot that is used to call all the atexit() hooks of a component that is to be unloaded. Most prominently this fixes the media_server crash at shutdown. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@23486 a95241bf-73f2-0310-859d-f6bbb57e9c96
74 lines
1.7 KiB
C
74 lines
1.7 KiB
C
/*
|
|
* Copyright 2003-2007, Axel Dörfler, axeld@pinc-software.de.
|
|
* Distributed under the terms of the MIT License.
|
|
*/
|
|
|
|
|
|
#include <libroot_private.h>
|
|
#include <user_runtime.h>
|
|
#include <fork.h>
|
|
#include <image.h>
|
|
|
|
#include <string.h>
|
|
|
|
|
|
void initialize_before(image_id imageID);
|
|
void _call_atexit_hooks_for_range(addr_t start, addr_t size);
|
|
void __init_exit_stack_lock();
|
|
|
|
struct rld_export *__gRuntimeLoader = NULL;
|
|
// This little bugger is set to something meaningful by the runtime loader
|
|
// Ugly, eh?
|
|
|
|
char *__progname = NULL;
|
|
int __libc_argc;
|
|
char **__libc_argv;
|
|
|
|
char _single_threaded = true;
|
|
// determines if I/O locking needed; needed for BeOS compatibility
|
|
|
|
thread_id __main_thread_id;
|
|
char **argv_save;
|
|
// needed for BeOS compatibility - they are set in the startup code
|
|
// (have a look at the glue/ directory)
|
|
|
|
int _data_offset_main_;
|
|
// this is obviously needed for R4.5 compatiblity
|
|
|
|
|
|
void
|
|
initialize_before(image_id imageID)
|
|
{
|
|
char *programPath = __gRuntimeLoader->program_args->args[0];
|
|
if (programPath) {
|
|
if ((__progname = strrchr(programPath, '/')) == NULL)
|
|
__progname = programPath;
|
|
else
|
|
__progname++;
|
|
}
|
|
|
|
__libc_argc = __gRuntimeLoader->program_args->arg_count;
|
|
__libc_argv = __gRuntimeLoader->program_args->args;
|
|
|
|
__gRuntimeLoader->call_atexit_hooks_for_range
|
|
= _call_atexit_hooks_for_range;
|
|
|
|
__init_exit_stack_lock();
|
|
__init_time();
|
|
__init_fork();
|
|
__init_heap();
|
|
__init_env(__gRuntimeLoader->program_args);
|
|
}
|
|
|
|
|
|
void _init_c_library_(void);
|
|
void
|
|
_init_c_library_(void)
|
|
{
|
|
// This function is called from the BeOS start_dyn.o - so it's called once
|
|
// for every application that was compiled under BeOS.
|
|
// Our libroot functions are already initialized above, so we don't have to
|
|
// do anything here.
|
|
}
|
|
|