* Add CanUnloadModule Signed-off-by: Michal Suchanek <hramr...@gmail.com> --- hw/xfree86/loader/loaderProcs.h | 5 +++++ hw/xfree86/loader/loadmod.c | 42 ++++++++++++++++++++++++++++++++++----- 2 files changed, 42 insertions(+), 5 deletions(-)
diff --git a/hw/xfree86/loader/loaderProcs.h b/hw/xfree86/loader/loaderProcs.h index 8b4b53f..5028554 100644 --- a/hw/xfree86/loader/loaderProcs.h +++ b/hw/xfree86/loader/loaderProcs.h @@ -87,6 +87,11 @@ unsigned long LoaderGetModuleVersion(ModuleDescPtr mod); void LoaderResetOptions(void); void LoaderSetOptions(unsigned long); +Bool IsBuiltinModule(ModuleDescPtr mod); +Bool IsDuplicated(ModuleDescPtr mod); +Bool IsDuplicateModule(ModuleDescPtr mod); +Bool CanUnloadModule(ModuleDescPtr mod); + /* Options for LoaderSetOptions */ #define LDR_OPT_ABI_MISMATCH_NONFATAL 0x0001 diff --git a/hw/xfree86/loader/loadmod.c b/hw/xfree86/loader/loadmod.c index a6adae9..8a48adb 100644 --- a/hw/xfree86/loader/loadmod.c +++ b/hw/xfree86/loader/loadmod.c @@ -785,7 +785,7 @@ LoadSubModule(pointer _parent, const char *module, submod = doLoadModule(module, NULL, subdirlist, patternlist, options, modreq, errmaj, errmin); - if (submod && submod != (ModuleDescPtr) 1) { + if (submod && !IsBuiltinModule(submod)) { parent->child = AddSibling(parent->child, submod); submod->parent = parent; } @@ -803,6 +803,19 @@ NewModuleDesc(const char *name) return mdp; } +/* An advisory function. When true is returned unloading the module should be + * safe. Uload can be attempted nonetheless. */ +int CanUnloadModule(ModuleDescPtr mod) +{ + if (IsBuiltinModule(mod)) + return 0; + if (IsDuplicated(mod)) + return 0; + /* Neither of the above can be true for modules for which IsDuplicateModule + * is true. */ + return 1; +} + ModuleDescPtr DuplicateModule(ModuleDescPtr mod, ModuleDescPtr parent) { @@ -1084,10 +1097,29 @@ UnloadModule(pointer mod) UnloadModuleOrDriver((ModuleDescPtr) mod); } +/* Is given module builtin? */ +Bool IsBuiltinModule(ModuleDescPtr mod) +{ + return (mod == (ModuleDescPtr) 1); +} + +/* Is given module duplicate of another? */ +Bool IsDuplicateModule(ModuleDescPtr mod) +{ + return (mod->TearDownData == ModuleDuplicated); +} + +/* Do duplicates of given module exist? */ +Bool IsDuplicated(ModuleDescPtr mod) +{ + /* cannot tell until reference counting is added */ + return TRUE; +} + static void UnloadModuleOrDriver(ModuleDescPtr mod) { - if (mod == (ModuleDescPtr) 1) + if (IsBuiltinModule(mod)) return; if (mod == NULL || mod->name == NULL) @@ -1100,7 +1132,7 @@ UnloadModuleOrDriver(ModuleDescPtr mod) LogMessageVerbSigSafe(X_INFO, 3, "UnloadModule: \"%s\"\n", mod->name); RemoveChild(mod); - if (mod->TearDownData != ModuleDuplicated) { + if (!IsDuplicateModule(mod)) { if ((mod->TearDownProc) && (mod->TearDownData)) mod->TearDownProc(mod->TearDownData); LoaderUnload(mod->name, mod->handle); @@ -1120,7 +1152,7 @@ UnloadSubModule(pointer _mod) ModuleDescPtr mod = (ModuleDescPtr) _mod; /* Some drivers are calling us on built-in submodules, ignore them */ - if (mod == (ModuleDescPtr) 1) + if (IsBuiltinModule(mod)) return; RemoveChild(mod); UnloadModuleOrDriver(mod); @@ -1244,7 +1276,7 @@ LoaderGetCanonicalName(const char *modname, PatternPtr patterns) unsigned long LoaderGetModuleVersion(ModuleDescPtr mod) { - if (!mod || mod == (ModuleDescPtr) 1 || !mod->VersionInfo) + if (!mod || IsBuiltinModule(mod) || !mod->VersionInfo) return 0; return MODULE_VERSION_NUMERIC(mod->VersionInfo->majorversion, -- 1.7.10.4 _______________________________________________ xorg-devel@lists.x.org: X.Org development Archives: http://lists.x.org/archives/xorg-devel Info: http://lists.x.org/mailman/listinfo/xorg-devel