diff --git a/headers/private/kernel/kmodule.h b/headers/private/kernel/kmodule.h index 14736fdb53..4b02692767 100644 --- a/headers/private/kernel/kmodule.h +++ b/headers/private/kernel/kmodule.h @@ -31,6 +31,7 @@ extern status_t load_module(const char *path, module_info ***_modules); extern status_t module_init(struct kernel_args *args); extern status_t module_init_post_threads(void); +extern status_t module_init_post_boot_device(void); #ifdef __cplusplus } diff --git a/src/system/kernel/main.cpp b/src/system/kernel/main.cpp index 153bb6d41d..353a6a8656 100644 --- a/src/system/kernel/main.cpp +++ b/src/system/kernel/main.cpp @@ -294,6 +294,8 @@ main2(void *unused) TRACE("device_manager_init_post_modules\n"); device_manager_init_post_modules(&sKernelArgs); + module_init_post_boot_device(); + boot_splash_set_stage(BOOT_SPLASH_STAGE_7_RUN_BOOT_SCRIPT); boot_splash_uninit(); // NOTE: We could introduce a syscall to draw more icons indicating diff --git a/src/system/kernel/module.cpp b/src/system/kernel/module.cpp index 3f34f0dbdd..7faa9c5c6d 100644 --- a/src/system/kernel/module.cpp +++ b/src/system/kernel/module.cpp @@ -1836,6 +1836,28 @@ module_init_post_threads(void) } +status_t +module_init_post_boot_device(void) +{ + RecursiveLocker locker(sModulesLock); + + hash_iterator iterator; + hash_open(sModuleImagesHash, &iterator); + + while (true) { + struct module_image* image + = (struct module_image*)hash_next(sModuleImagesHash, &iterator); + if (image == NULL) + break; + + if (image->ref_count == 0 && !image->keep_loaded) + unload_module_image(image, NULL); + } + + return B_OK; +} + + // #pragma mark - Exported Kernel API (public part)