static void init();
-static finish_destroy();
+static void finish_destroy();
static void module_release(LttvModule *m);
LttvModule *m;
GPtrArray *modules;
-
+ GPtrArray **modules_ptr = &modules; /* for strict aliasing */
guint i;
char *key;
+ char **key_ptr = &key; /* for strict aliasing */
for(i = 0 ; i < l->modules->len ; i++) {
m = (LttvModule *)(l->modules->pdata[i]);
g_hash_table_lookup_extended(modules_by_name, m->info.name,
- (gpointer *)&key, (gpointer *)&modules);
+ (gpointer *)key_ptr, (gpointer *)modules_ptr);
g_assert(modules != NULL);
g_ptr_array_remove(modules, m);
if(modules->len == 0) {
static LttvLibrary *library_load(char *name, GError **error)
{
- GModule *gm;
+ GModule *gm = NULL;
int i, nb;
- char *path, *pathname;
+ /* path is always initialized, checked */
+ char *path = NULL, *pathname;
LttvLibrary *l;
static void library_unload(LttvLibrary *l)
{
- guint i, len;
+ guint i;
GModule *gm;
void lttv_library_unload(LttvLibrary *l)
{
- l->info.load_count--;
+ /* In the case where we wait for a module to release, the load count is 0
+ * and should not be decremented. */
+ if(l->info.load_count != 0) l->info.load_count--;
library_unload(l);
}
}
-static finish_destroy()
+static void finish_destroy()
{
guint i;
locked_libraries = g_new(LttvLibrary *, nb);
for(i = 0 ; i < nb ; i++) {
+ //g_assert(nb == libraries->len);
l = (LttvLibrary *)(libraries->pdata[i]);
locked_libraries[i] = l;
library_lock_loaded(l);
m = (LttvModule *)(l->modules->pdata[j]);
while(m->info.require_count > 0) lttv_module_release(m);
}
+ library_unlock_loaded(l);
while(l->info.load_count > 0) lttv_library_unload(l);
+
+ /* If the number of librairies loaded have changed, restart from the
+ * beginning */
+ if(nb != libraries->len) {
+ i = 0;
+ nb = libraries->len;
+ }
+
}
for(i = 0 ; i < nb ; i++) {