X-Git-Url: https://git.lttng.org/?a=blobdiff_plain;f=ltt%2Fbranches%2Fpoly%2Flttv%2Fmodule.c;h=f73e6e935c367e796edb293886ecbf3bc6b3426a;hb=b445142a71748192520cfd645b4963e23070a486;hp=d207c0a7d016f367c73f148ad46d7abc26e21460;hpb=996acd9220aa2a8e2bb502cc95d140eb44c322de;p=lttv.git diff --git a/ltt/branches/poly/lttv/module.c b/ltt/branches/poly/lttv/module.c index d207c0a7..f73e6e93 100644 --- a/ltt/branches/poly/lttv/module.c +++ b/ltt/branches/poly/lttv/module.c @@ -5,6 +5,8 @@ #include +#define g_info(format...) g_log (G_LOG_DOMAIN, G_LOG_LEVEL_INFO, format) +#define g_debug(format...) g_log (G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG, format) struct _LttvModule { @@ -26,6 +28,7 @@ static void lttv_module_unload_all(); void lttv_module_init(int argc, char **argv) { + g_info("Init module.c"); modules = g_hash_table_new(g_str_hash, g_str_equal); modulesPaths = g_ptr_array_new(); } @@ -35,6 +38,8 @@ void lttv_module_destroy() { int i; + g_info("Destroy module.c"); + /* Unload all modules */ lttv_module_unload_all(); @@ -55,11 +60,12 @@ void lttv_module_destroy() void lttv_module_path_add(const char *name) { + g_info("Add module path %s", name); g_ptr_array_add(modulesPaths,(char*)g_strdup(name)); } -static LttvModuleInfo * +static LttvModule * module_load(const char *name, int argc, char **argv) { GModule *gm; @@ -69,60 +75,73 @@ module_load(const char *name, int argc, char **argv) int i; char *pathname; + + const char *module_name; LttvModuleInit init_function; + g_info("Load module %s", name); + /* Try to find the module along all the user specified paths */ for(i = 0 ; i < modulesPaths->len ; i++) { pathname = g_module_build_path(modulesPaths->pdata[i],name); + g_info("Try path %s", pathname); gm = g_module_open(pathname,0); g_free(pathname); if(gm != NULL) break; + g_info("Trial failed, %s", g_module_error()); } /* Try the default system path */ if(gm == NULL) { pathname = g_module_build_path(NULL,name); + g_info("Try default path"); gm = g_module_open(pathname,0); g_free(pathname); } /* Module cannot be found */ - - if(gm == NULL) return NULL; + if(gm == NULL) { + g_info("Trial failed, %s", g_module_error()); + g_info("Failed to load %s", name); + return NULL; + } /* Check if the module was already opened using the hopefully canonical name returned by g_module_name. */ - pathname = g_module_name(gm); + module_name = g_module_name(gm); - m = g_hash_table_lookup(modules, pathname); + m = g_hash_table_lookup(modules, module_name); if(m == NULL) { + g_info("Module %s (%s) loaded, call its init function", name, module_name); /* Module loaded for the first time. Insert it in the table and call the init function if any. */ - m = g_new(LttvModule); + m = g_new(LttvModule, 1); m->module = gm; m->ref_count = 0; m->load_count = 0; m->dependents = g_ptr_array_new(); - g_hash_table_insert(modules, pathname, m); + g_hash_table_insert(modules, (gpointer)module_name, m); if(!g_module_symbol(gm, "init", (gpointer)&init_function)) { g_warning("module %s (%s) has no init function", name, pathname); } - else init_Function(m, argc, argv); + else init_function(m, argc, argv); } else { /* Module was already opened, check that it really is the same and undo the extra g_module_open */ + g_info("Module %s (%s) was already loaded, no need to call init function", + name, module_name); if(m->module != gm) g_error("Two gmodules with the same pathname"); g_module_close(gm); } @@ -132,11 +151,11 @@ module_load(const char *name, int argc, char **argv) } -LttvModuleInfo * +LttvModule * lttv_module_load(const char *name, int argc, char **argv) { + g_info("Load module %s explicitly", name); LttvModule *m = module_load(name, argc, argv); - if(m != NULL) m->load_count++; return m; } @@ -147,6 +166,8 @@ lttv_module_require(LttvModule *m, const char *name, int argc, char **argv) { LttvModule *module; + g_info("Load module %s, as %s is a dependent requiring it", name, + g_module_name(m->module)); module = module_load(name, argc, argv); if(module != NULL) g_ptr_array_add(m->dependents, module); return module; @@ -159,16 +180,20 @@ static void module_unload(LttvModule *m) char *pathname; - guint len; + guint i, len; /* Decrement the reference count */ + g_info("Unload module %s", g_module_name(m->module)); m->ref_count--; - if(m->ref_count > 0) return; - + if(m->ref_count > 0) { + g_info("Module usage count decremented to %d", m->ref_count); + return; + } /* We really have to unload the module, first unload its dependents */ len = m->dependents->len; + g_info("Unload dependent modules"); for(i = 0 ; i < len ; i++) { module_unload(m->dependents->pdata[i]); @@ -178,6 +203,7 @@ static void module_unload(LttvModule *m) /* Unload the module itself */ + g_info("Call the destroy function and unload the module"); if(!g_module_symbol(m->module, "destroy", (gpointer)&destroy_function)) { g_warning("module (%s) has no destroy function", pathname); } @@ -192,6 +218,7 @@ static void module_unload(LttvModule *m) void lttv_module_unload(LttvModule *m) { + g_info("Explicitly unload module %s", g_module_name(m->module)); if(m->load_count <= 0) { g_error("more unload than load (%s)", g_module_name(m->module)); return; @@ -261,7 +288,7 @@ lttv_module_unload_all() g_hash_table_foreach(modules, list_independent, independent_modules); for(i = 0 ; i < independent_modules->len ; i++) { - m = (LttvModule)independent_modules->pdata[i]; + m = (LttvModule *)independent_modules->pdata[i]; while(m->load_count > 0) lttv_module_unload(m); }