diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/analysis/loading.c | 244 | ||||
-rw-r--r-- | src/analysis/loading.h | 19 | ||||
-rw-r--r-- | src/analysis/project.c | 93 | ||||
-rw-r--r-- | src/glibext/delayed.h | 10 | ||||
-rw-r--r-- | src/plugins/plugin-int.h | 2 | ||||
-rw-r--r-- | src/plugins/plugin.c | 6 | ||||
-rw-r--r-- | src/plugins/plugin.h | 2 |
7 files changed, 140 insertions, 236 deletions
diff --git a/src/analysis/loading.c b/src/analysis/loading.c index f2ae882..5e0f651 100644 --- a/src/analysis/loading.c +++ b/src/analysis/loading.c @@ -30,6 +30,7 @@ #include "../core/global.h" +#include "../glibext/chrysamarshal.h" #include "../glibext/delayed-int.h" #include "../plugins/pglist.h" @@ -51,7 +52,7 @@ typedef struct _GExploringWork { GDelayedWork parent; /* A laisser en premier */ - const gid_t *gid; /* Groupe d'appartenance */ + const wgroup_id_t *wid; /* Groupe d'appartenance */ GBinContent *content; /* Contenu brut à disposition */ @@ -84,10 +85,10 @@ static void g_exploring_work_finalize(GExploringWork *); static GExploringWork *g_exploring_work_new(GBinContent *); /* Fournit l'identifiant du groupe de rattachement de la tâche. */ -static gid_t g_exploring_work_get_group_id(const GExploringWork *); +static wgroup_id_t g_exploring_work_get_group_id(const GExploringWork *); /* Définit l'identifiant du groupe de rattachement de la tâche. */ -static void g_exploring_work_set_group_id(GExploringWork *, const gid_t *); +static void g_exploring_work_set_group_id(GExploringWork *, const wgroup_id_t *); /* Réalise l'exploration effective de formes de contenus. */ static void g_exploring_work_process(GExploringWork *, GtkStatusStack *); @@ -102,8 +103,7 @@ typedef struct _exploring_group { GBinContent *original; /* Contenu binaire initial */ - wgroup_id_t wid; /* Groupe de travail */ - gid_t gid; /* Groupe d'appartenance */ + wgroup_id_t wid; /* Groupe d'appartenance */ GBinContent **contents; /* Contenus reconnus dispos. */ size_t count; /* Taille de cette liste */ @@ -115,8 +115,6 @@ struct _GContentExplorer { GObject parent; /* A laisser en premier */ - gid_t generator; /* Générateur d'identifiants */ - exploring_group *groups; /* Rassemblement de chargements*/ size_t count; /* Nombre de ces groupes */ GMutex mutex; /* Accès protégé à la liste */ @@ -130,7 +128,7 @@ struct _GContentExplorerClass /* Signaux */ - void (* explored) (GContentExplorer *, gid_t); + void (* explored) (GContentExplorer *, wgroup_id_t); }; @@ -148,7 +146,7 @@ static void g_content_explorer_dispose(GContentExplorer *); static void g_content_explorer_finalize(GContentExplorer *); /* Retrouve le groupe correspondant à un identifiant donné. */ -static exploring_group *g_content_explorer_find_group(GContentExplorer *, gid_t); +static exploring_group *g_content_explorer_find_group(GContentExplorer *, wgroup_id_t); /* Note la fin d'une phase d'exploration de contenu. */ static void g_content_explorer_ack(GContentExplorer *, GExploringWork *); @@ -171,7 +169,7 @@ typedef struct _GResolvingWork { GDelayedWork parent; /* A laisser en premier */ - const gid_t *gid; /* Groupe d'appartenance */ + const wgroup_id_t *wid; /* Groupe d'appartenance */ GBinContent *content; /* Contenu brut à disposition */ @@ -204,10 +202,10 @@ static void g_resolving_work_finalize(GResolvingWork *); static GResolvingWork *g_resolving_work_new(GBinContent *); /* Fournit l'identifiant du groupe de rattachement de la tâche. */ -static gid_t g_resolving_work_get_group_id(const GResolvingWork *); +static wgroup_id_t g_resolving_work_get_group_id(const GResolvingWork *); /* Définit l'identifiant du groupe de rattachement de la tâche. */ -static void g_resolving_work_set_group_id(GResolvingWork *, const gid_t *); +static void g_resolving_work_set_group_id(GResolvingWork *, const wgroup_id_t *); /* Réalise la conversion effective de formes de contenus. */ static void g_resolving_work_process(GResolvingWork *, GtkStatusStack *); @@ -222,7 +220,7 @@ typedef struct _resolving_group { size_t remaining; /* Nombre de tâches restantes */ - const gid_t *gid; /* Groupe d'appartenance */ + const wgroup_id_t *wid; /* Groupe d'appartenance */ GLoadedContent **loaded; /* Contenus reconnus à intégrer*/ size_t count; /* Taille de cette liste */ @@ -247,7 +245,7 @@ struct _GContentResolverClass /* Signaux */ - void (* resolved) (GContentResolver *, gid_t); + void (* resolved) (GContentResolver *, wgroup_id_t); }; @@ -265,7 +263,7 @@ static void g_content_resolver_dispose(GContentResolver *); static void g_content_resolver_finalize(GContentResolver *); /* Retrouve le groupe correspondant à un identifiant donné. */ -static resolving_group *g_content_resolver_find_group(GContentResolver *, gid_t); +static resolving_group *g_content_resolver_find_group(GContentResolver *, wgroup_id_t); /* Note la fin d'une phase de resolution de contenu. */ static void g_content_resolver_ack(GContentResolver *, GResolvingWork *); @@ -324,7 +322,7 @@ static void g_exploring_work_class_init(GExploringWorkClass *klass) static void g_exploring_work_init(GExploringWork *work) { - work->gid = NULL; + work->wid = NULL; work->content = NULL; @@ -409,13 +407,13 @@ static GExploringWork *g_exploring_work_new(GBinContent *content) * * ******************************************************************************/ -static gid_t g_exploring_work_get_group_id(const GExploringWork *work) +static wgroup_id_t g_exploring_work_get_group_id(const GExploringWork *work) { - gid_t result; /* Identifiant à retourner */ + wgroup_id_t result; /* Identifiant à retourner */ - assert(work->gid != NULL); + assert(work->wid != NULL); - result = *work->gid; + result = *work->wid; return result; @@ -425,7 +423,7 @@ static gid_t g_exploring_work_get_group_id(const GExploringWork *work) /****************************************************************************** * * * Paramètres : work = instance à compléter. * -* gid = identifiant d'un même ensemble d'explorations. * +* wid = identifiant d'un même ensemble d'explorations. * * * * Description : Définit l'identifiant du groupe de rattachement de la tâche. * * * @@ -435,9 +433,9 @@ static gid_t g_exploring_work_get_group_id(const GExploringWork *work) * * ******************************************************************************/ -static void g_exploring_work_set_group_id(GExploringWork *work, const gid_t *gid) +static void g_exploring_work_set_group_id(GExploringWork *work, const wgroup_id_t *wid) { - work->gid = gid; + work->wid = wid; } @@ -457,11 +455,11 @@ static void g_exploring_work_set_group_id(GExploringWork *work, const gid_t *gid static void g_exploring_work_process(GExploringWork *work, GtkStatusStack *status) { - gid_t gid; /* Groupe d'appartenance */ + wgroup_id_t wid; /* Groupe d'appartenance */ - gid = g_exploring_work_get_group_id(work); + wid = g_exploring_work_get_group_id(work); - handle_binary_content(PGA_CONTENT_EXPLORER, work->content, gid, status); + handle_binary_content(PGA_CONTENT_EXPLORER, work->content, wid, status); } @@ -502,8 +500,8 @@ static void g_content_explorer_class_init(GContentExplorerClass *klass) G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(GContentExplorerClass, explored), NULL, NULL, - g_cclosure_marshal_VOID__UINT, - G_TYPE_NONE, 1, G_TYPE_UINT); + g_cclosure_user_marshal_VOID__UINT64, + G_TYPE_NONE, 1, G_TYPE_UINT64); } @@ -522,8 +520,6 @@ static void g_content_explorer_class_init(GContentExplorerClass *klass) static void g_content_explorer_init(GContentExplorer *explorer) { - explorer->generator = 0; - explorer->groups = NULL; explorer->count = 0; @@ -547,7 +543,7 @@ static void g_content_explorer_init(GContentExplorer *explorer) static void g_content_explorer_dispose(GContentExplorer *explorer) { while (explorer->count > 0) - g_content_explorer_delete_group(explorer, explorer->groups[0].gid); + g_content_explorer_delete_group(explorer, explorer->groups[0].wid); if (explorer->groups != NULL) free(explorer->groups); @@ -604,7 +600,7 @@ GContentExplorer *g_content_explorer_new(void) /****************************************************************************** * * * Paramètres : explorer = gestionnaire d'explorations à consulter. * -* gid = identifiant du groupe recherché. * +* wid = identifiant du groupe recherché. * * * * Description : Retrouve le groupe correspondant à un identifiant donné. * * * @@ -614,7 +610,7 @@ GContentExplorer *g_content_explorer_new(void) * * ******************************************************************************/ -static exploring_group *g_content_explorer_find_group(GContentExplorer *explorer, gid_t gid) +static exploring_group *g_content_explorer_find_group(GContentExplorer *explorer, wgroup_id_t wid) { exploring_group *result; /* Trouvaille à retourner */ size_t i; /* Boucle de parcours */ @@ -624,7 +620,7 @@ static exploring_group *g_content_explorer_find_group(GContentExplorer *explorer result = NULL; for (i = 0; i < explorer->count && result == NULL; i++) - if (explorer->groups[i].gid == gid) + if (explorer->groups[i].wid == wid) result = &explorer->groups[i]; return result; @@ -647,16 +643,16 @@ static exploring_group *g_content_explorer_find_group(GContentExplorer *explorer static void g_content_explorer_ack(GContentExplorer *explorer, GExploringWork *work) { - gid_t gid; /* Groupe d'appartenance */ + wgroup_id_t wid; /* Groupe d'appartenance */ exploring_group *group; /* Groupe d'opération concerné */ GWorkQueue *queue; /* Gestionnaire de différés */ bool empty; /* Fin de l'exploration ? */ - gid = g_exploring_work_get_group_id(work); + wid = g_exploring_work_get_group_id(work); g_mutex_lock(&explorer->mutex); - group = g_content_explorer_find_group(explorer, gid); + group = g_content_explorer_find_group(explorer, wid); assert(group != NULL); queue = get_work_queue(); @@ -666,7 +662,7 @@ static void g_content_explorer_ack(GContentExplorer *explorer, GExploringWork *w g_mutex_unlock(&explorer->mutex); if (empty) - g_signal_emit_by_name(explorer, "explored", gid); + g_signal_emit_by_name(explorer, "explored", wid); } @@ -684,47 +680,26 @@ static void g_content_explorer_ack(GContentExplorer *explorer, GExploringWork *w * * ******************************************************************************/ -const gid_t *g_content_explorer_create_group(GContentExplorer *explorer, GBinContent *content) +const wgroup_id_t *g_content_explorer_create_group(GContentExplorer *explorer, GBinContent *content) { - const gid_t *result; /* Identifiant à retourner */ - gid_t loop; /* Détection de boucle */ - gid_t id; /* Nouvelle identifiant généré */ - exploring_group *group; /* Groupe ciblé par l'opération*/ + const wgroup_id_t *result; /* Identifiant à retourner */ GWorkQueue *queue; /* Gestionnaire de différés */ + wgroup_id_t new; /* Nouvel identifiant */ + exploring_group *group; /* Groupe ciblé par l'opération*/ GExploringWork *work; /* Nouvelle vague d'exploration*/ g_mutex_lock(&explorer->mutex); /* Récupération d'un identifiant libre */ - /** - * Note : - * - * Comme 0 est l'identifiant du groupe de travail par défaut (DEFAULT_WORK_GROUP) - * et qu'il n'est pas possible de bloquer ce groupe lors des appels à - * g_work_queue_is_empty(), on différencie les identifiants de groupes - * de contenus et les identifiants de groupes de travail. - */ - - loop = explorer->generator; - - do - { - id = ++explorer->generator; - - /* Verification de la satisfaisabilité de la création */ - - assert(id != loop); - - /* Vérification que la place est libre... */ - - group = g_content_explorer_find_group(explorer, id); + queue = get_work_queue(); - if (group == NULL) - break; + new = g_work_queue_define_work_group(queue); - } - while (1); +#ifndef NDEBUG + group = g_content_explorer_find_group(explorer, new); + assert(group == NULL); +#endif /* Mise en place du groupe */ @@ -735,12 +710,9 @@ const gid_t *g_content_explorer_create_group(GContentExplorer *explorer, GBinCon group->original = content; g_object_ref(G_OBJECT(content)); - queue = get_work_queue(); - - group->wid = g_work_queue_define_work_group(queue); - group->gid = id; + group->wid = new; - result = &group->gid; + result = &group->wid; group->contents = NULL; group->count = 0; @@ -748,7 +720,7 @@ const gid_t *g_content_explorer_create_group(GContentExplorer *explorer, GBinCon /* Alimentation du contenu initial */ work = g_exploring_work_new(content); - g_exploring_work_set_group_id(work, &group->gid); + g_exploring_work_set_group_id(work, &group->wid); g_signal_connect_swapped(work, "work-completed", G_CALLBACK(g_content_explorer_ack), explorer); @@ -764,39 +736,7 @@ const gid_t *g_content_explorer_create_group(GContentExplorer *explorer, GBinCon /****************************************************************************** * * * Paramètres : explorer = gestionnaire d'explorations à manipuler. * -* gid = identifiant du groupe à consulter. * -* * -* Description : Fournit l'identifiant attribué pour les tâches parallèles. * -* * -* Retour : Identifiant des tâches liées au groupe. * -* * -* Remarques : - * -* * -******************************************************************************/ - -const wgroup_id_t *g_content_explorer_get_group_work_id(GContentExplorer *explorer, gid_t gid) -{ - const wgroup_id_t *result; /* Identifiant à retourner */ - exploring_group *group; /* Groupe d'opération concerné */ - - g_mutex_lock(&explorer->mutex); - - group = g_content_explorer_find_group(explorer, gid); - assert(group != NULL); - - result = &group->wid; - - g_mutex_unlock(&explorer->mutex); - - return result; - -} - - -/****************************************************************************** -* * -* Paramètres : explorer = gestionnaire d'explorations à manipuler. * -* gid = identifiant du groupe à supprimer. * +* wid = identifiant du groupe à supprimer. * * * * Description : Termine une vague d'exploration de contenu. * * * @@ -806,11 +746,8 @@ const wgroup_id_t *g_content_explorer_get_group_work_id(GContentExplorer *explor * * ******************************************************************************/ -void g_content_explorer_delete_group(GContentExplorer *explorer, gid_t gid) +void g_content_explorer_delete_group(GContentExplorer *explorer, wgroup_id_t wid) { - - - exploring_group *group; /* Groupe ciblé par l'opération*/ GWorkQueue *queue; /* Gestionnaire de différés */ size_t i; /* Boucle de parcours */ @@ -818,7 +755,7 @@ void g_content_explorer_delete_group(GContentExplorer *explorer, gid_t gid) g_mutex_lock(&explorer->mutex); - group = g_content_explorer_find_group(explorer, gid); + group = g_content_explorer_find_group(explorer, wid); /* Supression des contenus chargés */ @@ -850,7 +787,7 @@ void g_content_explorer_delete_group(GContentExplorer *explorer, gid_t gid) /****************************************************************************** * * * Paramètres : explorer = gestionnaire d'explorations à consulter. * -* gid = identifiant du groupe à parcourir. * +* wid = identifiant du groupe à parcourir. * * content = nouveau contenu à intégrer. * * * * Description : Ajoute un nouveau contenu découvert au crédit d'un groupe. * @@ -861,7 +798,7 @@ void g_content_explorer_delete_group(GContentExplorer *explorer, gid_t gid) * * ******************************************************************************/ -void g_content_explorer_populate_group(GContentExplorer *explorer, gid_t gid, GBinContent *content) +void g_content_explorer_populate_group(GContentExplorer *explorer, wgroup_id_t wid, GBinContent *content) { exploring_group *group; /* Groupe d'opération concerné */ GWorkQueue *queue; /* Gestionnaire de différés */ @@ -869,7 +806,7 @@ void g_content_explorer_populate_group(GContentExplorer *explorer, gid_t gid, GB g_mutex_lock(&explorer->mutex); - group = g_content_explorer_find_group(explorer, gid); + group = g_content_explorer_find_group(explorer, wid); assert(group != NULL); /* Conservation du résultat */ @@ -881,7 +818,7 @@ void g_content_explorer_populate_group(GContentExplorer *explorer, gid_t gid, GB /* Relancement des explorations */ work = g_exploring_work_new(content); - g_exploring_work_set_group_id(work, &group->gid); + g_exploring_work_set_group_id(work, &group->wid); g_signal_connect_swapped(work, "work-completed", G_CALLBACK(g_content_explorer_ack), explorer); @@ -897,7 +834,7 @@ void g_content_explorer_populate_group(GContentExplorer *explorer, gid_t gid, GB /****************************************************************************** * * * Paramètres : explorer = gestionnaire d'explorations à consulter. * -* gid = identifiant du groupe à parcourir. * +* wid = identifiant du groupe à parcourir. * * count = nombre de contenus binaires retournés. [OUT] * * * * Description : Fournit la liste de tous les contenus disponibles. * @@ -908,7 +845,7 @@ void g_content_explorer_populate_group(GContentExplorer *explorer, gid_t gid, GB * * ******************************************************************************/ -GBinContent **g_content_explorer_get_all(GContentExplorer *explorer, gid_t gid, size_t *count) +GBinContent **g_content_explorer_get_all(GContentExplorer *explorer, wgroup_id_t wid, size_t *count) { GBinContent **result; /* Trouvailles à retourner */ exploring_group *group; /* Groupe d'opération concerné */ @@ -916,7 +853,7 @@ GBinContent **g_content_explorer_get_all(GContentExplorer *explorer, gid_t gid, g_mutex_lock(&explorer->mutex); - group = g_content_explorer_find_group(explorer, gid); + group = g_content_explorer_find_group(explorer, wid); assert(group != NULL); /* Allocation de la liste finale */ @@ -1000,7 +937,7 @@ static void g_resolving_work_class_init(GResolvingWorkClass *klass) static void g_resolving_work_init(GResolvingWork *work) { - work->gid = NULL; + work->wid = NULL; work->content = NULL; @@ -1085,13 +1022,13 @@ static GResolvingWork *g_resolving_work_new(GBinContent *content) * * ******************************************************************************/ -static gid_t g_resolving_work_get_group_id(const GResolvingWork *work) +static wgroup_id_t g_resolving_work_get_group_id(const GResolvingWork *work) { - gid_t result; /* Identifiant à retourner */ + wgroup_id_t result; /* Identifiant à retourner */ - assert(work->gid != NULL); + assert(work->wid != NULL); - result = *work->gid; + result = *work->wid; return result; @@ -1101,7 +1038,7 @@ static gid_t g_resolving_work_get_group_id(const GResolvingWork *work) /****************************************************************************** * * * Paramètres : work = instance à compléter. * -* gid = identifiant d'un même ensemble de conversions. * +* wid = identifiant d'un même ensemble de conversions. * * * * Description : Définit l'identifiant du groupe de rattachement de la tâche. * * * @@ -1111,9 +1048,9 @@ static gid_t g_resolving_work_get_group_id(const GResolvingWork *work) * * ******************************************************************************/ -static void g_resolving_work_set_group_id(GResolvingWork *work, const gid_t *gid) +static void g_resolving_work_set_group_id(GResolvingWork *work, const wgroup_id_t *wid) { - work->gid = gid; + work->wid = wid; } @@ -1133,11 +1070,11 @@ static void g_resolving_work_set_group_id(GResolvingWork *work, const gid_t *gid static void g_resolving_work_process(GResolvingWork *work, GtkStatusStack *status) { - gid_t gid; /* Groupe d'appartenance */ + wgroup_id_t wid; /* Groupe d'appartenance */ - gid = g_resolving_work_get_group_id(work); + wid = g_resolving_work_get_group_id(work); - handle_binary_content(PGA_CONTENT_RESOLVER, work->content, gid, status); + handle_binary_content(PGA_CONTENT_RESOLVER, work->content, wid, status); } @@ -1178,8 +1115,8 @@ static void g_content_resolver_class_init(GContentResolverClass *klass) G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(GContentResolverClass, resolved), NULL, NULL, - g_cclosure_marshal_VOID__UINT, - G_TYPE_NONE, 1, G_TYPE_UINT); + g_cclosure_user_marshal_VOID__UINT64, + G_TYPE_NONE, 1, G_TYPE_UINT64); } @@ -1217,7 +1154,7 @@ static void g_content_resolver_init(GContentResolver *resolver) static void g_content_resolver_dispose(GContentResolver *resolver) { while (resolver->count > 0) - g_content_resolver_delete_group(resolver, *resolver->groups[0].gid); + g_content_resolver_delete_group(resolver, *resolver->groups[0].wid); if (resolver->groups != NULL) free(resolver->groups); @@ -1274,7 +1211,7 @@ GContentResolver *g_content_resolver_new(void) /****************************************************************************** * * * Paramètres : resolver = gestionnaire de résolutions à consulter. * -* gid = identifiant du groupe recherché. * +* wid = identifiant du groupe recherché. * * * * Description : Retrouve le groupe correspondant à un identifiant donné. * * * @@ -1284,7 +1221,7 @@ GContentResolver *g_content_resolver_new(void) * * ******************************************************************************/ -static resolving_group *g_content_resolver_find_group(GContentResolver *resolver, gid_t gid) +static resolving_group *g_content_resolver_find_group(GContentResolver *resolver, wgroup_id_t wid) { resolving_group *result; /* Trouvaille à retourner */ size_t i; /* Boucle de parcours */ @@ -1294,7 +1231,7 @@ static resolving_group *g_content_resolver_find_group(GContentResolver *resolver result = NULL; for (i = 0; i < resolver->count && result == NULL; i++) - if (*resolver->groups[i].gid == gid) + if (*resolver->groups[i].wid == wid) result = &resolver->groups[i]; return result; @@ -1317,15 +1254,15 @@ static resolving_group *g_content_resolver_find_group(GContentResolver *resolver static void g_content_resolver_ack(GContentResolver *resolver, GResolvingWork *work) { - gid_t gid; /* Groupe d'appartenance */ + wgroup_id_t wid; /* Groupe d'appartenance */ resolving_group *group; /* Groupe d'opération concerné */ bool empty; /* Fin de l'resolvation ? */ - gid = g_resolving_work_get_group_id(work); + wid = g_resolving_work_get_group_id(work); g_mutex_lock(&resolver->mutex); - group = g_content_resolver_find_group(resolver, gid); + group = g_content_resolver_find_group(resolver, wid); assert(group != NULL); assert(group->remaining > 0); @@ -1335,7 +1272,7 @@ static void g_content_resolver_ack(GContentResolver *resolver, GResolvingWork *w g_mutex_unlock(&resolver->mutex); if (empty) - g_signal_emit_by_name(resolver, "resolved", gid); + g_signal_emit_by_name(resolver, "resolved", wid); } @@ -1344,7 +1281,6 @@ static void g_content_resolver_ack(GContentResolver *resolver, GResolvingWork *w * * * Paramètres : resolver = gestionnaire de résolutions à manipuler. * * wid = identifiant du groupe de tâches réservé. * -* gid = identifiant unique généré en amont. * * contents = contenus à analyser. * * count = nombre de ces contenus. * * * @@ -1356,7 +1292,7 @@ static void g_content_resolver_ack(GContentResolver *resolver, GResolvingWork *w * * ******************************************************************************/ -void g_content_resolver_create_group(GContentResolver *resolver, const wgroup_id_t *wid, const gid_t *gid, GBinContent **contents, size_t count) +void g_content_resolver_create_group(GContentResolver *resolver, const wgroup_id_t *wid, GBinContent **contents, size_t count) { resolving_group *group; /* Groupe ciblé par l'opération*/ GWorkQueue *queue; /* Gestionnaire de différés */ @@ -1373,7 +1309,7 @@ void g_content_resolver_create_group(GContentResolver *resolver, const wgroup_id group->remaining = count; - group->gid = gid; + group->wid = wid; group->loaded = NULL; group->count = 0; @@ -1385,7 +1321,7 @@ void g_content_resolver_create_group(GContentResolver *resolver, const wgroup_id for (i = 0; i < count; i++) { work = g_resolving_work_new(contents[i]); - g_resolving_work_set_group_id(work, gid); + g_resolving_work_set_group_id(work, wid); g_signal_connect_swapped(work, "work-completed", G_CALLBACK(g_content_resolver_ack), resolver); @@ -1401,7 +1337,7 @@ void g_content_resolver_create_group(GContentResolver *resolver, const wgroup_id /****************************************************************************** * * * Paramètres : resolver = gestionnaire d'explorations à manipuler. * -* gid = identifiant du groupe à supprimer. * +* wid = identifiant du groupe à supprimer. * * * * Description : Termine une vague de résolution de contenu. * * * @@ -1411,7 +1347,7 @@ void g_content_resolver_create_group(GContentResolver *resolver, const wgroup_id * * ******************************************************************************/ -void g_content_resolver_delete_group(GContentResolver *resolver, gid_t gid) +void g_content_resolver_delete_group(GContentResolver *resolver, wgroup_id_t wid) { resolving_group *group; /* Groupe ciblé par l'opération*/ size_t i; /* Boucle de parcours */ @@ -1419,7 +1355,7 @@ void g_content_resolver_delete_group(GContentResolver *resolver, gid_t gid) g_mutex_lock(&resolver->mutex); - group = g_content_resolver_find_group(resolver, gid); + group = g_content_resolver_find_group(resolver, wid); /* Supression des contenus chargés */ @@ -1447,7 +1383,7 @@ void g_content_resolver_delete_group(GContentResolver *resolver, gid_t gid) /****************************************************************************** * * * Paramètres : resolver = gestionnaire de résolutions à consulter. * -* gid = identifiant du groupe recherché. * +* wid = identifiant du groupe recherché. * * loaded = contenu chargé et pouvant être représenté. * * * * Description : Intègre un contenu chargé dans les résultats. * @@ -1458,13 +1394,13 @@ void g_content_resolver_delete_group(GContentResolver *resolver, gid_t gid) * * ******************************************************************************/ -void g_content_resolver_add_detected(GContentResolver *resolver, gid_t gid, GLoadedContent *loaded) +void g_content_resolver_add_detected(GContentResolver *resolver, wgroup_id_t wid, GLoadedContent *loaded) { resolving_group *group; /* Groupe ciblé par l'opération*/ g_mutex_lock(&resolver->mutex); - group = g_content_resolver_find_group(resolver, gid); + group = g_content_resolver_find_group(resolver, wid); group->loaded = (GLoadedContent **)realloc(group->loaded, ++group->count * sizeof(GLoadedContent *)); @@ -1478,7 +1414,7 @@ void g_content_resolver_add_detected(GContentResolver *resolver, gid_t gid, GLoa /****************************************************************************** * * * Paramètres : resolver = gestionnaire de resolutions à consulter. * -* gid = identifiant du groupe à parcourir. * +* wid = identifiant du groupe à parcourir. * * count = nombre de contenus binaires retournés. [OUT] * * * * Description : Fournit la liste de tous les contenus chargés valables. * @@ -1489,7 +1425,7 @@ void g_content_resolver_add_detected(GContentResolver *resolver, gid_t gid, GLoa * * ******************************************************************************/ -GLoadedContent **g_content_resolver_get_all(GContentResolver *resolver, gid_t gid, size_t *count) +GLoadedContent **g_content_resolver_get_all(GContentResolver *resolver, wgroup_id_t wid, size_t *count) { GLoadedContent **result; /* Trouvailles à retourner */ resolving_group *group; /* Groupe d'opération concerné */ @@ -1497,7 +1433,7 @@ GLoadedContent **g_content_resolver_get_all(GContentResolver *resolver, gid_t gi g_mutex_lock(&resolver->mutex); - group = g_content_resolver_find_group(resolver, gid); + group = g_content_resolver_find_group(resolver, wid); assert(group != NULL); /* Allocation de la liste finale */ diff --git a/src/analysis/loading.h b/src/analysis/loading.h index 4755226..19cd12d 100644 --- a/src/analysis/loading.h +++ b/src/analysis/loading.h @@ -59,19 +59,16 @@ GType g_content_explorer_get_type(void); GContentExplorer *g_content_explorer_new(void); /* Initie une nouvelle vague d'exploration de contenu. */ -const gid_t *g_content_explorer_create_group(GContentExplorer *, GBinContent *); - -/* Fournit l'identifiant attribué pour les tâches parallèles. */ -const wgroup_id_t *g_content_explorer_get_group_work_id(GContentExplorer *, gid_t); +const wgroup_id_t *g_content_explorer_create_group(GContentExplorer *, GBinContent *); /* Termine une vague d'exploration de contenu. */ -void g_content_explorer_delete_group(GContentExplorer *, gid_t); +void g_content_explorer_delete_group(GContentExplorer *, wgroup_id_t); /* Ajoute un nouveau contenu découvert au crédit d'un groupe. */ -void g_content_explorer_populate_group(GContentExplorer *, gid_t, GBinContent *); +void g_content_explorer_populate_group(GContentExplorer *, wgroup_id_t, GBinContent *); /* Fournit la liste de tous les contenus disponibles. */ -GBinContent **g_content_explorer_get_all(GContentExplorer *, gid_t, size_t *); +GBinContent **g_content_explorer_get_all(GContentExplorer *, wgroup_id_t, size_t *); @@ -100,16 +97,16 @@ GType g_content_resolver_get_type(void); GContentResolver *g_content_resolver_new(void); /* Initie une nouvelle vague de résolution de contenus. */ -void g_content_resolver_create_group(GContentResolver *, const wgroup_id_t *, const gid_t *, GBinContent **, size_t); +void g_content_resolver_create_group(GContentResolver *, const wgroup_id_t *, GBinContent **, size_t); /* Termine une vague de résolution de contenu. */ -void g_content_resolver_delete_group(GContentResolver *, gid_t); +void g_content_resolver_delete_group(GContentResolver *, wgroup_id_t); /* Intègre un contenu chargé dans les résultats. */ -void g_content_resolver_add_detected(GContentResolver *, gid_t, GLoadedContent *); +void g_content_resolver_add_detected(GContentResolver *, wgroup_id_t, GLoadedContent *); /* Fournit la liste de tous les contenus chargés valables. */ -GLoadedContent **g_content_resolver_get_all(GContentResolver *, gid_t, size_t *); +GLoadedContent **g_content_resolver_get_all(GContentResolver *, wgroup_id_t, size_t *); diff --git a/src/analysis/project.c b/src/analysis/project.c index b4108ff..d2228e2 100644 --- a/src/analysis/project.c +++ b/src/analysis/project.c @@ -46,11 +46,7 @@ /* Suivi du chargement de contenus binaires */ typedef struct _loading_params { - union - { - const gid_t *exp_gid; /* Identifiant d'exploration */ - const gid_t **exp_gids; /* Identifiants d'exploration */ - }; + const wgroup_id_t **exp_wids; /* Identifiants d'exploration */ size_t exp_count; /* Quantitié d'identifiants */ size_t resolved; /* Compteur de résolutions */ @@ -115,16 +111,16 @@ static loading_params *g_study_project_prepare_content_loading(GStudyProject *); static void g_study_project_destroy_content_loading(GStudyProject *, loading_params *); /* Retrouve les infos de chargements liées à une exploration. */ -static loading_params *g_study_project_find_exploration(GStudyProject *, gid_t, const gid_t **); +static loading_params *g_study_project_find_exploration(GStudyProject *, wgroup_id_t, const wgroup_id_t **); /* Assure l'intégration de contenus listés dans du XML. */ static void g_study_project_recover_binary_contents(GStudyProject *, xmlDoc *, xmlXPathContext *); /* Note la fin d'une phase d'exploration de contenu. */ -static void on_new_content_explored(GContentExplorer *, gid_t, GStudyProject *); +static void on_new_content_explored(GContentExplorer *, wgroup_id_t, GStudyProject *); /* Note la fin d'une phase de resolution de contenu. */ -static void on_new_content_resolved(GContentResolver *, gid_t, GStudyProject *); +static void on_new_content_resolved(GContentResolver *, wgroup_id_t, GStudyProject *); /* Réceptionne la recette d'une analyse de contenu. */ static void on_loaded_content_analyzed(GLoadedContent *, gboolean, GStudyProject *); @@ -568,23 +564,13 @@ static void g_study_project_destroy_content_loading(GStudyProject *project, load explorer = get_current_content_explorer(); resolver = get_current_content_resolver(); - if (params->exp_count == 1) + for (i = 0; i < params->exp_count; i++) { - g_content_resolver_delete_group(resolver, *params->exp_gid); - g_content_explorer_delete_group(explorer, *params->exp_gid); + g_content_resolver_delete_group(resolver, *params->exp_wids[i]); + g_content_explorer_delete_group(explorer, *params->exp_wids[i]); } - else - { - for (i = 0; i < params->exp_count; i++) - { - g_content_resolver_delete_group(resolver, *params->exp_gids[i]); - g_content_explorer_delete_group(explorer, *params->exp_gids[i]); - } - - free(params->exp_gids); - - } + free(params->exp_wids); g_object_unref(G_OBJECT(explorer)); g_object_unref(G_OBJECT(resolver)); @@ -611,7 +597,7 @@ static void g_study_project_destroy_content_loading(GStudyProject *project, load /****************************************************************************** * * * Paramètres : project = projet dont le contenu est à consulter. * -* gid = identifiant du groupe d'exploration recherché. * +* wid = identifiant du groupe d'exploration recherché. * * ptr = pointeur vers la valeur d'origine externe. * * * * Description : Retrouve les infos de chargements liées à une exploration. * @@ -622,10 +608,10 @@ static void g_study_project_destroy_content_loading(GStudyProject *project, load * * ******************************************************************************/ -static loading_params *g_study_project_find_exploration(GStudyProject *project, gid_t gid, const gid_t **ptr) +static loading_params *g_study_project_find_exploration(GStudyProject *project, wgroup_id_t wid, const wgroup_id_t **ptr) { loading_params *result; /* Trouvaille à retourner */ - const gid_t *value; /* Raccourci de confort */ + const wgroup_id_t *value; /* Raccourci de confort */ size_t i; /* Boucle de parcours #1 */ size_t k; /* Boucle de parcours #2 */ @@ -636,28 +622,15 @@ static loading_params *g_study_project_find_exploration(GStudyProject *project, value = NULL; for (i = 0; i < project->ld_count && result == NULL; i++) - { - if (project->ld_params[i].exp_count == 1) + for (k = 0; k < project->ld_params[i].exp_count && result == NULL; k++) { - value = project->ld_params[i].exp_gid; + value = project->ld_params[i].exp_wids[k]; - if (*value == gid) + if (*value == wid) result = &project->ld_params[i]; } - else - for (k = 0; k < project->ld_params[i].exp_count && result == NULL; k++) - { - value = project->ld_params[i].exp_gids[k]; - - if (*value == gid) - result = &project->ld_params[i]; - - } - - } - if (ptr != NULL) { assert(result == NULL || value != NULL); @@ -706,8 +679,7 @@ static void g_study_project_recover_binary_contents(GStudyProject *project, xmlD params = g_study_project_prepare_content_loading(project); - if (count > 1) - params->exp_gids = (const gid_t **)malloc(count * sizeof(gid_t *)); + params->exp_wids = (const wgroup_id_t **)malloc(count * sizeof(wgroup_id_t *)); params->resolved = 0; @@ -730,13 +702,7 @@ static void g_study_project_recover_binary_contents(GStudyProject *project, xmlD continue; } - if (count == 1) - { - params->exp_gid = g_content_explorer_create_group(explorer, content); - explored++; - } - else - params->exp_gids[explored++] = g_content_explorer_create_group(explorer, content); + params->exp_wids[explored++] = g_content_explorer_create_group(explorer, content); g_object_unref(G_OBJECT(content)); @@ -780,7 +746,7 @@ void g_study_project_discover_binary_content(GStudyProject *project, GBinContent params = g_study_project_prepare_content_loading(project); - params->exp_gid = g_content_explorer_create_group(explorer, content); + params->exp_wids = (const wgroup_id_t **)malloc(sizeof(wgroup_id_t *)); params->exp_count = 1; params->resolved = 0; @@ -788,6 +754,8 @@ void g_study_project_discover_binary_content(GStudyProject *project, GBinContent params->xdoc = NULL; params->context = NULL; + params->exp_wids[0] = g_content_explorer_create_group(explorer, content); + g_mutex_unlock(&project->ld_mutex); g_object_unref(G_OBJECT(explorer)); @@ -798,7 +766,7 @@ void g_study_project_discover_binary_content(GStudyProject *project, GBinContent /****************************************************************************** * * * Paramètres : explorer = gestionnaire d'explorations à consulter. * -* gid = groupe d'exploration concerné. * +* wid = groupe d'exploration concerné. * * project = projet avide des résultats des opérations. * * * * Description : Note la fin d'une phase d'exploration de contenu. * @@ -809,31 +777,28 @@ void g_study_project_discover_binary_content(GStudyProject *project, GBinContent * * ******************************************************************************/ -static void on_new_content_explored(GContentExplorer *explorer, gid_t gid, GStudyProject *project) +static void on_new_content_explored(GContentExplorer *explorer, wgroup_id_t wid, GStudyProject *project) { - const gid_t *gid_ptr; /* Référence vers l'origine */ + const wgroup_id_t *wid_ptr; /* Référence vers l'origine */ loading_params *params; /* Informations de chargement */ GBinContent **available; /* Contenus binaires présents */ size_t count; /* Quantité de ces contenus */ - const wgroup_id_t *wid; /* Groupe de tâches */ GContentResolver *resolver; /* Resolveur de contenus */ size_t i; /* Boucle de parcours */ g_mutex_lock(&project->ld_mutex); - params = g_study_project_find_exploration(project, gid, &gid_ptr); + params = g_study_project_find_exploration(project, wid, &wid_ptr); /* S'il s'agit bien d'une exploration nouvelle */ if (params != NULL) { - wid = g_content_explorer_get_group_work_id(explorer, gid); - - available = g_content_explorer_get_all(explorer, gid, &count); + available = g_content_explorer_get_all(explorer, wid, &count); assert(count > 0); resolver = get_current_content_resolver(); - g_content_resolver_create_group(resolver, wid, gid_ptr, available, count); + g_content_resolver_create_group(resolver, wid_ptr, available, count); g_object_unref(G_OBJECT(resolver)); @@ -852,7 +817,7 @@ static void on_new_content_explored(GContentExplorer *explorer, gid_t gid, GStud /****************************************************************************** * * * Paramètres : resolver = gestionnaire de résolutions à consulter. * -* gid = groupe d'exploration concerné. * +* wid = groupe d'exploration concerné. * * project = projet avide des résultats des opérations. * * * * Description : Note la fin d'une phase de resolution de contenu. * @@ -863,7 +828,7 @@ static void on_new_content_explored(GContentExplorer *explorer, gid_t gid, GStud * * ******************************************************************************/ -static void on_new_content_resolved(GContentResolver *resolver, gid_t gid, GStudyProject *project) +static void on_new_content_resolved(GContentResolver *resolver, wgroup_id_t wid, GStudyProject *project) { loading_params *params; /* Informations de chargement */ GLoadedContent **available; /* Contenus chargés valables */ @@ -878,12 +843,12 @@ static void on_new_content_resolved(GContentResolver *resolver, gid_t gid, GStud g_mutex_lock(&project->ld_mutex); - params = g_study_project_find_exploration(project, gid, NULL); + params = g_study_project_find_exploration(project, wid, NULL); /* S'il s'agit bien d'une exploration nouvelle */ if (params != NULL) { - available = g_content_resolver_get_all(resolver, gid, &count); + available = g_content_resolver_get_all(resolver, wid, &count); /* Rechargement à partir d'XML ? */ if (params->xdoc != NULL) diff --git a/src/glibext/delayed.h b/src/glibext/delayed.h index c22cc5a..4669d2d 100644 --- a/src/glibext/delayed.h +++ b/src/glibext/delayed.h @@ -27,6 +27,7 @@ #include <glib-object.h> #include <stdbool.h> +#include <stdint.h> @@ -79,8 +80,13 @@ typedef struct _GWorkQueue GWorkQueue; typedef struct _GWorkQueueClass GWorkQueueClass; -/* Identifiant unique pour groupe de travail */ -typedef unsigned long long wgroup_id_t; +/** + * Identifiant unique pour groupe de travail. + * + * Le nombre de bits est forcé à 64 bits car glib-genmarshal ne reconnait + * pas explicitement le type 'unsigned long long'. + */ +typedef uint64_t wgroup_id_t; /* Indique le type défini pour le gestionnaire des travaux différés. */ diff --git a/src/plugins/plugin-int.h b/src/plugins/plugin-int.h index 5fae2de..4625ec7 100644 --- a/src/plugins/plugin-int.h +++ b/src/plugins/plugin-int.h @@ -47,7 +47,7 @@ typedef void (* pg_process_disassembly_fc) (const GPluginModule *, PluginAction, /* Procède à une opération liée à un contenu binaire. */ -typedef void (* pg_handle_content) (const GPluginModule *, PluginAction, GBinContent *, gid_t, GtkStatusStack *); +typedef void (* pg_handle_content) (const GPluginModule *, PluginAction, GBinContent *, wgroup_id_t, GtkStatusStack *); /* Procède à une opération liée au format de fichier uniquement. */ typedef bool (* pg_handle_format) (const GPluginModule *, PluginAction, GBinFormat *, GtkStatusStack *); diff --git a/src/plugins/plugin.c b/src/plugins/plugin.c index 02684d6..c74043d 100644 --- a/src/plugins/plugin.c +++ b/src/plugins/plugin.c @@ -709,7 +709,7 @@ void g_plugin_module_log_variadic_message(const GPluginModule *plugin, LogMessag * Paramètres : plugin = greffon à manipuler. * * action = type d'action attendue. * * content = contenu binaire à traiter. * -* gid = identifiant du groupe de traitement. * +* wid = identifiant du groupe de traitement. * * status = barre de statut à tenir informée. * * * * Description : Procède à une opération liée à un contenu binaire. * @@ -720,9 +720,9 @@ void g_plugin_module_log_variadic_message(const GPluginModule *plugin, LogMessag * * ******************************************************************************/ -void g_plugin_module_handle_binary_content(const GPluginModule *plugin, PluginAction action, GBinContent *content, gid_t gid, GtkStatusStack *status) +void g_plugin_module_handle_binary_content(const GPluginModule *plugin, PluginAction action, GBinContent *content, wgroup_id_t wid, GtkStatusStack *status) { - return plugin->handle_content(plugin, action, content, gid, status); + return plugin->handle_content(plugin, action, content, wid, status); } diff --git a/src/plugins/plugin.h b/src/plugins/plugin.h index 9ac6aa6..5837078 100644 --- a/src/plugins/plugin.h +++ b/src/plugins/plugin.h @@ -92,7 +92,7 @@ bool g_plugin_module_resolve_dependencies(GPluginModule *, GPluginModule **, siz bool g_plugin_module_load(GPluginModule *, GPluginModule **, size_t); /* Procède à une opération liée à un contenu binaire. */ -void g_plugin_module_handle_binary_content(const GPluginModule *, PluginAction, GBinContent *, gid_t, GtkStatusStack *); +void g_plugin_module_handle_binary_content(const GPluginModule *, PluginAction, GBinContent *, wgroup_id_t, GtkStatusStack *); /* Procède à une opération liée au format de fichier uniquement. */ bool g_plugin_module_handle_binary_format(const GPluginModule *, PluginAction, GBinFormat *, GtkStatusStack *); |