From 32560010419a8fb79fdaf335ab066d2133fec700 Mon Sep 17 00:00:00 2001 From: Augustin Cavalier Date: Tue, 18 Dec 2018 18:01:09 -0500 Subject: [PATCH] runtime_loader: Reinit the heap lock after fork. --- src/system/runtime_loader/export.cpp | 12 ++++++++++++ src/system/runtime_loader/heap.cpp | 10 +++++++++- src/system/runtime_loader/runtime_loader_private.h | 5 +++-- 3 files changed, 24 insertions(+), 3 deletions(-) diff --git a/src/system/runtime_loader/export.cpp b/src/system/runtime_loader/export.cpp index a480210cbd..81146ff2eb 100644 --- a/src/system/runtime_loader/export.cpp +++ b/src/system/runtime_loader/export.cpp @@ -43,6 +43,18 @@ export_unload_library(void* handle) } +status_t +reinit_after_fork() +{ + status_t returnstatus = B_OK; + if (status_t status = elf_reinit_after_fork()) + returnstatus = status; + if (status_t status = heap_reinit_after_fork()) + returnstatus = status; + return returnstatus; +} + + struct rld_export gRuntimeLoader = { // dynamic loading support API export_load_add_on, diff --git a/src/system/runtime_loader/heap.cpp b/src/system/runtime_loader/heap.cpp index 0d6ac28c8b..ee358f06e1 100644 --- a/src/system/runtime_loader/heap.cpp +++ b/src/system/runtime_loader/heap.cpp @@ -288,12 +288,20 @@ grow_heap(size_t bytes) status_t -heap_init(void) +heap_init() { return add_area(kInitialHeapSize); } +status_t +heap_reinit_after_fork() +{ + recursive_lock_init(&sLock, kLockName); + return B_OK; +} + + #ifdef HEAP_TEST void dump_chunks(void) diff --git a/src/system/runtime_loader/runtime_loader_private.h b/src/system/runtime_loader/runtime_loader_private.h index b21eda2ca8..e2886285e0 100644 --- a/src/system/runtime_loader/runtime_loader_private.h +++ b/src/system/runtime_loader/runtime_loader_private.h @@ -100,9 +100,10 @@ status_t elf64_verify_header(void *header, size_t length); void rldelf_init(void); void rldexport_init(void); void set_abi_version(int abi_version); -status_t elf_reinit_after_fork(void); +status_t elf_reinit_after_fork(); -status_t heap_init(void); +status_t heap_init(); +status_t heap_reinit_after_fork(); // arch dependent prototypes status_t arch_relocate_image(image_t* rootImage, image_t* image,