diff --git a/src/system/runtime_loader/elf.cpp b/src/system/runtime_loader/elf.cpp index fb617260ee..c4fa305ee6 100644 --- a/src/system/runtime_loader/elf.cpp +++ b/src/system/runtime_loader/elf.cpp @@ -53,20 +53,6 @@ static uint32 sPreloadedImageCount = 0; static recursive_lock sLock = RECURSIVE_LOCK_INITIALIZER(kLockName); -static inline void -rld_lock() -{ - recursive_lock_lock(&sLock); -} - - -static inline void -rld_unlock() -{ - recursive_lock_unlock(&sLock); -} - - static const char * find_dt_rpath(image_t *image) { @@ -431,7 +417,7 @@ load_program(char const *path, void **_entry) KTRACE("rld: load_program(\"%s\")", path); - rld_lock(); + RecursiveLocker _(sLock); // for now, just do stupid simple global locking preload_images(); @@ -475,8 +461,6 @@ load_program(char const *path, void **_entry) *_entry = (void *)(gProgramImage->entry_point); - rld_unlock(); - gProgramLoaded = true; KTRACE("rld: load_program(\"%s\") done: entry: %p, id: %" B_PRId32 , path, @@ -499,7 +483,6 @@ err: gErrorMessage.Buffer(), gErrorMessage.ContentSize(), 0, 0); } _kern_loading_app_failed(status); - rld_unlock(); return status; } @@ -517,7 +500,7 @@ load_library(char const *path, uint32 flags, bool addOn, void** _handle) KTRACE("rld: load_library(\"%s\", %#" B_PRIx32 ", %d)", path, flags, addOn); - rld_lock(); + RecursiveLocker _(sLock); // for now, just do stupid simple global locking // have we already loaded this library? @@ -526,7 +509,6 @@ load_library(char const *path, uint32 flags, bool addOn, void** _handle) // a NULL path is fine -- it means the global scope shall be opened if (path == NULL) { *_handle = RLD_GLOBAL_SCOPE; - rld_unlock(); return 0; } @@ -536,7 +518,6 @@ load_library(char const *path, uint32 flags, bool addOn, void** _handle) if (image) { atomic_add(&image->ref_count, 1); - rld_unlock(); KTRACE("rld: load_library(\"%s\"): already loaded: %" B_PRId32, path, image->id); *_handle = image; @@ -546,7 +527,6 @@ load_library(char const *path, uint32 flags, bool addOn, void** _handle) status = load_image(path, type, NULL, NULL, &image); if (status < B_OK) { - rld_unlock(); KTRACE("rld: load_library(\"%s\") failed to load container: %s", path, strerror(status)); return status; @@ -582,8 +562,6 @@ load_library(char const *path, uint32 flags, bool addOn, void** _handle) remap_images(); init_dependencies(image, true); - rld_unlock(); - KTRACE("rld: load_library(\"%s\") done: id: %" B_PRId32, path, image->id); *_handle = image; @@ -594,7 +572,6 @@ err: dequeue_loaded_image(image); delete_image(image); - rld_unlock(); return status; } @@ -611,7 +588,7 @@ unload_library(void* handle, image_id imageID, bool addOn) if (handle == RLD_GLOBAL_SCOPE) return B_OK; - rld_lock(); + RecursiveLocker _(sLock); // for now, just do stupid simple global locking if (gInvalidImageIDs) { @@ -694,7 +671,6 @@ unload_library(void* handle, image_id imageID, bool addOn) } } - rld_unlock(); return status; } @@ -707,14 +683,12 @@ get_nth_symbol(image_id imageID, int32 num, char *nameBuffer, uint32 i; image_t *image; - rld_lock(); + RecursiveLocker _(sLock); // get the image from those who have been already initialized image = find_loaded_image_by_id(imageID, false); - if (image == NULL) { - rld_unlock(); + if (image == NULL) return B_BAD_IMAGE_ID; - } // iterate through all the hash buckets until we've found the one for (i = 0; i < HASHTABSIZE(image); i++) { @@ -749,8 +723,6 @@ get_nth_symbol(image_id imageID, int32 num, char *nameBuffer, } } out: - rld_unlock(); - if (num != count) return B_BAD_INDEX; @@ -763,13 +735,11 @@ get_nearest_symbol_at_address(void* address, image_id* _imageID, char** _imagePath, char** _imageName, char** _symbolName, int32* _type, void** _location, bool* _exactMatch) { - rld_lock(); + RecursiveLocker _(sLock); image_t* image = find_loaded_image_by_address((addr_t)address); - if (image == NULL) { - rld_unlock(); + if (image == NULL) return B_BAD_VALUE; - } bool exactMatch = false; elf_sym* foundSymbol = NULL; @@ -824,7 +794,6 @@ get_nearest_symbol_at_address(void* address, image_id* _imageID, *_location = NULL; } - rld_unlock(); return B_OK; } @@ -850,7 +819,7 @@ get_symbol(image_id imageID, char const *symbolName, int32 symbolType, || strcmp(symbolName, B_TERM_AFTER_FUNCTION_NAME) == 0) return B_BAD_VALUE; - rld_lock(); + RecursiveLocker _(sLock); // for now, just do stupid simple global locking // get the image from those who have been already initialized @@ -874,7 +843,6 @@ get_symbol(image_id imageID, char const *symbolName, int32 symbolType, } else status = B_BAD_IMAGE_ID; - rld_unlock(); return status; } @@ -888,7 +856,7 @@ get_library_symbol(void* handle, void* caller, const char* symbolName, if (symbolName == NULL) return B_BAD_VALUE; - rld_lock(); + RecursiveLocker _(sLock); // for now, just do stupid simple global locking if (handle == RTLD_DEFAULT || handle == RLD_GLOBAL_SCOPE) { @@ -986,7 +954,6 @@ get_library_symbol(void* handle, void* caller, const char* symbolName, &inImage, _location); } - rld_unlock(); return status; } @@ -1001,19 +968,15 @@ get_next_image_dependency(image_id id, uint32 *cookie, const char **_name) if (_name == NULL) return B_BAD_VALUE; - rld_lock(); + RecursiveLocker _(sLock); image = find_loaded_image_by_id(id, false); - if (image == NULL) { - rld_unlock(); + if (image == NULL) return B_BAD_IMAGE_ID; - } dynamicSection = (elf_dyn *)image->dynamic_ptr; - if (dynamicSection == NULL || image->num_needed <= searchIndex) { - rld_unlock(); + if (dynamicSection == NULL || image->num_needed <= searchIndex) return B_ENTRY_NOT_FOUND; - } for (i = 0, j = 0; dynamicSection[i].d_tag != DT_NULL; i++) { if (dynamicSection[i].d_tag != DT_NEEDED) @@ -1024,12 +987,10 @@ get_next_image_dependency(image_id id, uint32 *cookie, const char **_name) *_name = STRING(image, neededOffset); *cookie = searchIndex + 1; - rld_unlock(); return B_OK; } } - rld_unlock(); return B_ENTRY_NOT_FOUND; }