From 5a123e35911db0e706f1376638fb67d10c94d464 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Axel=20D=C3=B6rfler?= Date: Fri, 22 Aug 2008 09:41:10 +0000 Subject: [PATCH] * Added a post boot device module init function that unloads all unused modules, as they aren't unloaded when there is no boot device yet. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@27136 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- headers/private/kernel/kmodule.h | 1 + src/system/kernel/main.cpp | 2 ++ src/system/kernel/module.cpp | 22 ++++++++++++++++++++++ 3 files changed, 25 insertions(+) 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)