From bb242c2cda6a590fef652e62688c10e2d52a7ff0 Mon Sep 17 00:00:00 2001
From: Cyrille Bagard <nocbos@gmail.com>
Date: Wed, 9 May 2018 13:56:15 +0200
Subject: Simplified the content loading handling.

---
 plugins/dex/core.c            |   6 +-
 plugins/dex/core.h            |   2 +-
 plugins/elf/core.c            |   6 +-
 plugins/elf/core.h            |   2 +-
 plugins/pychrysalide/plugin.c |   8 +-
 src/analysis/loading.c        | 244 ++++++++++++++++--------------------------
 src/analysis/loading.h        |  19 ++--
 src/analysis/project.c        |  93 +++++-----------
 src/glibext/delayed.h         |  10 +-
 src/plugins/plugin-int.h      |   2 +-
 src/plugins/plugin.c          |   6 +-
 src/plugins/plugin.h          |   2 +-
 12 files changed, 152 insertions(+), 248 deletions(-)

diff --git a/plugins/dex/core.c b/plugins/dex/core.c
index da0a540..a0bea80 100644
--- a/plugins/dex/core.c
+++ b/plugins/dex/core.c
@@ -66,7 +66,7 @@ G_MODULE_EXPORT bool chrysalide_plugin_init(GPluginModule *plugin)
 *  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.           *
@@ -77,7 +77,7 @@ G_MODULE_EXPORT bool chrysalide_plugin_init(GPluginModule *plugin)
 *                                                                             *
 ******************************************************************************/
 
-G_MODULE_EXPORT void chrysalide_plugin_handle_binary_content(const GPluginModule *plugin, PluginAction action, GBinContent *content, gid_t gid, GtkStatusStack *status)
+G_MODULE_EXPORT void chrysalide_plugin_handle_binary_content(const GPluginModule *plugin, PluginAction action, GBinContent *content, wgroup_id_t wid, GtkStatusStack *status)
 {
     bool test;                              /* Bilan des accès mémoire     */
     GExeFormat *format;                     /* Format DEX reconnu          */
@@ -92,7 +92,7 @@ G_MODULE_EXPORT void chrysalide_plugin_handle_binary_content(const GPluginModule
         loaded = g_loaded_binary_new(format);
 
         resolver = get_current_content_resolver();
-        g_content_resolver_add_detected(resolver, gid, loaded);
+        g_content_resolver_add_detected(resolver, wid, loaded);
         g_object_unref(G_OBJECT(resolver));
 
     }
diff --git a/plugins/dex/core.h b/plugins/dex/core.h
index 8a07f84..ab4908b 100644
--- a/plugins/dex/core.h
+++ b/plugins/dex/core.h
@@ -34,7 +34,7 @@
 G_MODULE_EXPORT bool chrysalide_plugin_init(GPluginModule *);
 
 /* Procède à une opération liée à un contenu binaire. */
-G_MODULE_EXPORT void chrysalide_plugin_handle_binary_content(const GPluginModule *, PluginAction, GBinContent *, gid_t, GtkStatusStack *);
+G_MODULE_EXPORT void chrysalide_plugin_handle_binary_content(const GPluginModule *, PluginAction, GBinContent *, wgroup_id_t, GtkStatusStack *);
 
 
 
diff --git a/plugins/elf/core.c b/plugins/elf/core.c
index 03d5964..1fefa69 100644
--- a/plugins/elf/core.c
+++ b/plugins/elf/core.c
@@ -66,7 +66,7 @@ G_MODULE_EXPORT bool chrysalide_plugin_init(GPluginModule *plugin)
 *  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.           *
@@ -77,7 +77,7 @@ G_MODULE_EXPORT bool chrysalide_plugin_init(GPluginModule *plugin)
 *                                                                             *
 ******************************************************************************/
 
-G_MODULE_EXPORT void chrysalide_plugin_handle_binary_content(const GPluginModule *plugin, PluginAction action, GBinContent *content, gid_t gid, GtkStatusStack *status)
+G_MODULE_EXPORT void chrysalide_plugin_handle_binary_content(const GPluginModule *plugin, PluginAction action, GBinContent *content, wgroup_id_t wid, GtkStatusStack *status)
 {
     bool test;                              /* Bilan des accès mémoire     */
     GExeFormat *format;                     /* Format ELF reconnu          */
@@ -92,7 +92,7 @@ G_MODULE_EXPORT void chrysalide_plugin_handle_binary_content(const GPluginModule
         loaded = g_loaded_binary_new(format);
 
         resolver = get_current_content_resolver();
-        g_content_resolver_add_detected(resolver, gid, loaded);
+        g_content_resolver_add_detected(resolver, wid, loaded);
         g_object_unref(G_OBJECT(resolver));
 
     }
diff --git a/plugins/elf/core.h b/plugins/elf/core.h
index ec9ed5c..17afc71 100644
--- a/plugins/elf/core.h
+++ b/plugins/elf/core.h
@@ -34,7 +34,7 @@
 G_MODULE_EXPORT bool chrysalide_plugin_init(GPluginModule *);
 
 /* Procède à une opération liée à un contenu binaire. */
-G_MODULE_EXPORT void chrysalide_plugin_handle_binary_content(const GPluginModule *, PluginAction, GBinContent *, gid_t, GtkStatusStack *);
+G_MODULE_EXPORT void chrysalide_plugin_handle_binary_content(const GPluginModule *, PluginAction, GBinContent *, wgroup_id_t, GtkStatusStack *);
 
 
 
diff --git a/plugins/pychrysalide/plugin.c b/plugins/pychrysalide/plugin.c
index db1c9f3..38d8785 100644
--- a/plugins/pychrysalide/plugin.c
+++ b/plugins/pychrysalide/plugin.c
@@ -83,7 +83,7 @@ static bool g_python_plugin_do_init(GPythonPlugin *);
 static bool g_python_plugin_do_exit(GPythonPlugin *, GObject *);
 
 /* Procède à une opération liée à un contenu binaire. */
-static void g_python_plugin_handle_binary_content(const GPythonPlugin *, PluginAction, GBinContent *, gid_t, GtkStatusStack *);
+static void g_python_plugin_handle_binary_content(const GPythonPlugin *, PluginAction, GBinContent *, wgroup_id_t, GtkStatusStack *);
 
 /* Indique si le format peut être pris en charge ici. */
 FormatMatchStatus python_plugin_is_matching(GBinContent *, GExeFormat *, GPythonPlugin *, char **);
@@ -614,7 +614,7 @@ static bool g_python_plugin_do_exit(GPythonPlugin *plugin, GObject *ref)
 *  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.           *
@@ -625,7 +625,7 @@ static bool g_python_plugin_do_exit(GPythonPlugin *plugin, GObject *ref)
 *                                                                             *
 ******************************************************************************/
 
-static void g_python_plugin_handle_binary_content(const GPythonPlugin *plugin, PluginAction action, GBinContent *content, gid_t gid, GtkStatusStack *status)
+static void g_python_plugin_handle_binary_content(const GPythonPlugin *plugin, PluginAction action, GBinContent *content, wgroup_id_t wid, GtkStatusStack *status)
 {
     PyObject *args;                         /* Arguments pour l'appel      */
     PyObject *value;                        /* Valeurs obtenues            */
@@ -634,7 +634,7 @@ static void g_python_plugin_handle_binary_content(const GPythonPlugin *plugin, P
 
     PyTuple_SetItem(args, 0, PyLong_FromUnsignedLong(action));
     PyTuple_SetItem(args, 1, pygobject_new(G_OBJECT(content)));
-    PyTuple_SetItem(args, 2, PyLong_FromUnsignedLong(gid));
+    PyTuple_SetItem(args, 2, PyLong_FromUnsignedLong(wid));
     PyTuple_SetItem(args, 3, pygobject_new(G_OBJECT(status)));
 
     value = run_python_method(plugin->instance, "handle_binary_content", args);
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 *);
-- 
cgit v0.11.2-87-g4458