diff --git a/headers/private/kernel/user_runtime.h b/headers/private/kernel/user_runtime.h index fbc3a300f0..e9b367cf58 100644 --- a/headers/private/kernel/user_runtime.h +++ b/headers/private/kernel/user_runtime.h @@ -39,6 +39,8 @@ struct rld_export { status_t (*get_next_image_dependency)(image_id id, uint32 *cookie, const char **_name); + status_t (*reinit_after_fork)(); + const struct user_space_program_args *program_args; }; diff --git a/src/system/libroot/posix/unistd/fork.c b/src/system/libroot/posix/unistd/fork.c index 7936770a50..3257e30342 100644 --- a/src/system/libroot/posix/unistd/fork.c +++ b/src/system/libroot/posix/unistd/fork.c @@ -4,13 +4,15 @@ */ -#include #include #include #include #include +#include +#include + typedef struct fork_hook { struct fork_hook *next; @@ -153,6 +155,7 @@ fork(void) // ToDo: initialize child __main_thread_id = find_thread(NULL); __init_fork(); + __gRuntimeLoader->reinit_after_fork(); call_fork_hooks(sChildHooks); } else { diff --git a/src/system/runtime_loader/elf.cpp b/src/system/runtime_loader/elf.cpp index 6623a7db44..5b976d5617 100644 --- a/src/system/runtime_loader/elf.cpp +++ b/src/system/runtime_loader/elf.cpp @@ -1670,3 +1670,14 @@ rldelf_init(void) sErrorMessage.SetTo(buffer, 1024, 'Rler'); } } + + +status_t +elf_reinit_after_fork() +{ + rld_sem = create_sem(1, "rld_lock"); + if (rld_sem < 0) + return rld_sem; + + return B_OK; +} diff --git a/src/system/runtime_loader/export.c b/src/system/runtime_loader/export.c index 6d5d84da3e..25b3815950 100644 --- a/src/system/runtime_loader/export.c +++ b/src/system/runtime_loader/export.c @@ -34,7 +34,9 @@ struct rld_export gRuntimeLoader = { get_symbol, get_nth_symbol, test_executable, - get_next_image_dependency + get_next_image_dependency, + + elf_reinit_after_fork }; diff --git a/src/system/runtime_loader/runtime_loader_private.h b/src/system/runtime_loader/runtime_loader_private.h index a6719dd51a..530c685a07 100644 --- a/src/system/runtime_loader/runtime_loader_private.h +++ b/src/system/runtime_loader/runtime_loader_private.h @@ -44,6 +44,7 @@ int resolve_symbol(image_t *rootImage, image_t *image, struct Elf32_Sym *sym, status_t elf_verify_header(void *header, int32 length); void rldelf_init(void); void rldexport_init(void); +status_t elf_reinit_after_fork(); status_t heap_init(void);