From 74063a8f0e00e1b53b45ddcbd47348d9acce3f67 Mon Sep 17 00:00:00 2001 From: Cyrille Bagard Date: Wed, 6 Jun 2018 18:59:19 +0200 Subject: Simplified the whole loading process. --- src/analysis/loading.c | 71 ++++++++++++++++++++++++++++++-------------------- src/analysis/loading.h | 4 +-- src/analysis/project.c | 38 ++++++++------------------- 3 files changed, 56 insertions(+), 57 deletions(-) diff --git a/src/analysis/loading.c b/src/analysis/loading.c index 5e0f651..fa2118f 100644 --- a/src/analysis/loading.c +++ b/src/analysis/loading.c @@ -52,7 +52,10 @@ typedef struct _GExploringWork { GDelayedWork parent; /* A laisser en premier */ - const wgroup_id_t *wid; /* Groupe d'appartenance */ + wgroup_id_t wid; /* Groupe d'appartenance */ +#ifndef NDEBUG + bool wid_defined; /* Validation de l'identifiant */ +#endif GBinContent *content; /* Contenu brut à disposition */ @@ -88,7 +91,7 @@ static GExploringWork *g_exploring_work_new(GBinContent *); 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 wgroup_id_t *); +static void g_exploring_work_set_group_id(GExploringWork *, wgroup_id_t); /* Réalise l'exploration effective de formes de contenus. */ static void g_exploring_work_process(GExploringWork *, GtkStatusStack *); @@ -169,7 +172,10 @@ typedef struct _GResolvingWork { GDelayedWork parent; /* A laisser en premier */ - const wgroup_id_t *wid; /* Groupe d'appartenance */ + wgroup_id_t wid; /* Groupe d'appartenance */ +#ifndef NDEBUG + bool wid_defined; /* Validation de l'identifiant */ +#endif GBinContent *content; /* Contenu brut à disposition */ @@ -205,7 +211,7 @@ static GResolvingWork *g_resolving_work_new(GBinContent *); 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 wgroup_id_t *); +static void g_resolving_work_set_group_id(GResolvingWork *, wgroup_id_t); /* Réalise la conversion effective de formes de contenus. */ static void g_resolving_work_process(GResolvingWork *, GtkStatusStack *); @@ -220,7 +226,7 @@ typedef struct _resolving_group { size_t remaining; /* Nombre de tâches restantes */ - const wgroup_id_t *wid; /* Groupe d'appartenance */ + wgroup_id_t wid; /* Groupe d'appartenance */ GLoadedContent **loaded; /* Contenus reconnus à intégrer*/ size_t count; /* Taille de cette liste */ @@ -322,7 +328,9 @@ static void g_exploring_work_class_init(GExploringWorkClass *klass) static void g_exploring_work_init(GExploringWork *work) { - work->wid = NULL; +#ifndef NDEBUG + work->wid_defined = false; +#endif work->content = NULL; @@ -411,9 +419,9 @@ static wgroup_id_t g_exploring_work_get_group_id(const GExploringWork *work) { wgroup_id_t result; /* Identifiant à retourner */ - assert(work->wid != NULL); + assert(work->wid_defined); - result = *work->wid; + result = work->wid; return result; @@ -433,8 +441,12 @@ static wgroup_id_t g_exploring_work_get_group_id(const GExploringWork *work) * * ******************************************************************************/ -static void g_exploring_work_set_group_id(GExploringWork *work, const wgroup_id_t *wid) +static void g_exploring_work_set_group_id(GExploringWork *work, wgroup_id_t wid) { +#ifndef NDEBUG + work->wid_defined = true; +#endif + work->wid = wid; } @@ -680,11 +692,10 @@ static void g_content_explorer_ack(GContentExplorer *explorer, GExploringWork *w * * ******************************************************************************/ -const wgroup_id_t *g_content_explorer_create_group(GContentExplorer *explorer, GBinContent *content) +wgroup_id_t g_content_explorer_create_group(GContentExplorer *explorer, GBinContent *content) { - const wgroup_id_t *result; /* Identifiant à retourner */ + 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*/ @@ -694,10 +705,10 @@ const wgroup_id_t *g_content_explorer_create_group(GContentExplorer *explorer, G queue = get_work_queue(); - new = g_work_queue_define_work_group(queue); + result = g_work_queue_define_work_group(queue); #ifndef NDEBUG - group = g_content_explorer_find_group(explorer, new); + group = g_content_explorer_find_group(explorer, result); assert(group == NULL); #endif @@ -710,9 +721,7 @@ const wgroup_id_t *g_content_explorer_create_group(GContentExplorer *explorer, G group->original = content; g_object_ref(G_OBJECT(content)); - group->wid = new; - - result = &group->wid; + group->wid = result; group->contents = NULL; group->count = 0; @@ -720,11 +729,11 @@ const wgroup_id_t *g_content_explorer_create_group(GContentExplorer *explorer, G /* Alimentation du contenu initial */ work = g_exploring_work_new(content); - g_exploring_work_set_group_id(work, &group->wid); + g_exploring_work_set_group_id(work, result); g_signal_connect_swapped(work, "work-completed", G_CALLBACK(g_content_explorer_ack), explorer); - g_work_queue_schedule_work(queue, G_DELAYED_WORK(work), group->wid); + g_work_queue_schedule_work(queue, G_DELAYED_WORK(work), result); g_mutex_unlock(&explorer->mutex); @@ -818,7 +827,7 @@ void g_content_explorer_populate_group(GContentExplorer *explorer, wgroup_id_t w /* Relancement des explorations */ work = g_exploring_work_new(content); - g_exploring_work_set_group_id(work, &group->wid); + g_exploring_work_set_group_id(work, group->wid); g_signal_connect_swapped(work, "work-completed", G_CALLBACK(g_content_explorer_ack), explorer); @@ -937,7 +946,9 @@ static void g_resolving_work_class_init(GResolvingWorkClass *klass) static void g_resolving_work_init(GResolvingWork *work) { - work->wid = NULL; +#ifndef NDEBUG + work->wid_defined = false; +#endif work->content = NULL; @@ -1026,9 +1037,9 @@ static wgroup_id_t g_resolving_work_get_group_id(const GResolvingWork *work) { wgroup_id_t result; /* Identifiant à retourner */ - assert(work->wid != NULL); + assert(work->wid_defined); - result = *work->wid; + result = work->wid; return result; @@ -1048,8 +1059,12 @@ static wgroup_id_t g_resolving_work_get_group_id(const GResolvingWork *work) * * ******************************************************************************/ -static void g_resolving_work_set_group_id(GResolvingWork *work, const wgroup_id_t *wid) +static void g_resolving_work_set_group_id(GResolvingWork *work, wgroup_id_t wid) { +#ifndef NDEBUG + work->wid_defined = true; +#endif + work->wid = wid; } @@ -1154,7 +1169,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].wid); + g_content_resolver_delete_group(resolver, resolver->groups[0].wid); if (resolver->groups != NULL) free(resolver->groups); @@ -1231,7 +1246,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].wid == wid) + if (resolver->groups[i].wid == wid) result = &resolver->groups[i]; return result; @@ -1292,7 +1307,7 @@ static void g_content_resolver_ack(GContentResolver *resolver, GResolvingWork *w * * ******************************************************************************/ -void g_content_resolver_create_group(GContentResolver *resolver, const wgroup_id_t *wid, GBinContent **contents, size_t count) +void g_content_resolver_create_group(GContentResolver *resolver, 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 */ @@ -1325,7 +1340,7 @@ void g_content_resolver_create_group(GContentResolver *resolver, const wgroup_id g_signal_connect_swapped(work, "work-completed", G_CALLBACK(g_content_resolver_ack), resolver); - g_work_queue_schedule_work(queue, G_DELAYED_WORK(work), *wid); + g_work_queue_schedule_work(queue, G_DELAYED_WORK(work), wid); } diff --git a/src/analysis/loading.h b/src/analysis/loading.h index 19cd12d..c7ede58 100644 --- a/src/analysis/loading.h +++ b/src/analysis/loading.h @@ -59,7 +59,7 @@ GType g_content_explorer_get_type(void); GContentExplorer *g_content_explorer_new(void); /* Initie une nouvelle vague d'exploration de contenu. */ -const wgroup_id_t *g_content_explorer_create_group(GContentExplorer *, GBinContent *); +wgroup_id_t g_content_explorer_create_group(GContentExplorer *, GBinContent *); /* Termine une vague d'exploration de contenu. */ void g_content_explorer_delete_group(GContentExplorer *, wgroup_id_t); @@ -97,7 +97,7 @@ 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 *, GBinContent **, size_t); +void g_content_resolver_create_group(GContentResolver *, wgroup_id_t, GBinContent **, size_t); /* Termine une vague de résolution de contenu. */ void g_content_resolver_delete_group(GContentResolver *, wgroup_id_t); diff --git a/src/analysis/project.c b/src/analysis/project.c index 13887ee..83b41c4 100644 --- a/src/analysis/project.c +++ b/src/analysis/project.c @@ -118,7 +118,7 @@ typedef struct _GLoadingHandler xmlDoc *xdoc; /* Structure XML chargée ? */ xmlXPathContext *context; /* Eventuel contexte XML */ - const wgroup_id_t **exp_wids; /* Identifiants d'exploration */ + wgroup_id_t *exp_wids; /* Identifiants d'exploration */ size_t exp_count; /* Quantitié d'identifiants */ size_t resolved; /* Compteur de résolutions */ GCond wait_cond; /* Réveil d'attente de fin */ @@ -159,7 +159,7 @@ static GLoadingHandler *g_loading_handler_new_recovering(GStudyProject *, xmlDoc static void g_loading_handler_process(GLoadingHandler *, GtkStatusStack *); /* Détermine si un encadrement est adapté pour un identifiant. */ -static bool g_loading_handler_check(GLoadingHandler *, wgroup_id_t, const wgroup_id_t **); +static bool g_loading_handler_check(GLoadingHandler *, wgroup_id_t); /* Note la fin d'une phase d'exploration de contenu. */ static void on_new_content_explored(GContentExplorer *, wgroup_id_t, GLoadingHandler *); @@ -865,8 +865,8 @@ static void g_loading_handler_dispose(GLoadingHandler *handler) for (i = 0; i < handler->exp_count; i++) { - g_content_resolver_delete_group(resolver, *handler->exp_wids[i]); - g_content_explorer_delete_group(explorer, *handler->exp_wids[i]); + g_content_resolver_delete_group(resolver, handler->exp_wids[i]); + g_content_explorer_delete_group(explorer, handler->exp_wids[i]); } g_mutex_unlock(&handler->mutex); @@ -938,7 +938,7 @@ static GLoadingHandler *g_loading_handler_new_discovering(GStudyProject *project result->xdoc = NULL; result->context = NULL; - result->exp_wids = (const wgroup_id_t **)malloc(sizeof(wgroup_id_t *)); + result->exp_wids = (wgroup_id_t *)malloc(sizeof(wgroup_id_t)); result->exp_count = 1; result->resolved = 0; @@ -997,7 +997,7 @@ static GLoadingHandler *g_loading_handler_new_recovering(GStudyProject *project, result->xdoc = xdoc; result->context = context; - result->exp_wids = (const wgroup_id_t **)malloc(count * sizeof(wgroup_id_t *)); + result->exp_wids = (wgroup_id_t *)malloc(count * sizeof(wgroup_id_t)); result->resolved = 0; @@ -1075,7 +1075,6 @@ static void g_loading_handler_process(GLoadingHandler *handler, GtkStatusStack * * * * Paramètres : handler = gestionnaire dont contenu est à consulter. * * wid = identifiant du groupe d'exploration recherché. * -* ptr = pointeur vers la valeur d'origine externe. * * * * Description : Détermine si un encadrement est adapté pour un identifiant. * * * @@ -1085,31 +1084,17 @@ static void g_loading_handler_process(GLoadingHandler *handler, GtkStatusStack * * * ******************************************************************************/ -static bool g_loading_handler_check(GLoadingHandler *handler, wgroup_id_t wid, const wgroup_id_t **ptr) +static bool g_loading_handler_check(GLoadingHandler *handler, wgroup_id_t wid) { bool result; /* Bilan à retourner */ - const wgroup_id_t *value; /* Raccourci de confort */ size_t i; /* Boucle de parcours */ assert(!g_mutex_trylock(&handler->mutex)); result = false; - value = NULL; - for (i = 0; i < handler->exp_count && !result; i++) - { - value = handler->exp_wids[i]; - - result = (*value == wid); - - } - - if (ptr != NULL) - { - assert(!result || value != NULL); - *ptr = (result ? value : NULL); - } + result = (handler->exp_wids[i] == wid); return result; @@ -1132,7 +1117,6 @@ static bool g_loading_handler_check(GLoadingHandler *handler, wgroup_id_t wid, c static void on_new_content_explored(GContentExplorer *explorer, wgroup_id_t wid, GLoadingHandler *handler) { - const wgroup_id_t *wid_ptr; /* Référence vers l'origine */ GBinContent **available; /* Contenus binaires présents */ size_t count; /* Quantité de ces contenus */ GContentResolver *resolver; /* Resolveur de contenus */ @@ -1140,14 +1124,14 @@ static void on_new_content_explored(GContentExplorer *explorer, wgroup_id_t wid, g_mutex_lock(&handler->mutex); - if (g_loading_handler_check(handler, wid, &wid_ptr)) + if (g_loading_handler_check(handler, wid)) { available = g_content_explorer_get_all(explorer, wid, &count); assert(count > 0); resolver = get_current_content_resolver(); - g_content_resolver_create_group(resolver, wid_ptr, available, count); + g_content_resolver_create_group(resolver, wid, available, count); g_object_unref(G_OBJECT(resolver)); @@ -1191,7 +1175,7 @@ static void on_new_content_resolved(GContentResolver *resolver, wgroup_id_t wid, g_mutex_lock(&handler->mutex); - if (g_loading_handler_check(handler, wid, NULL)) + if (g_loading_handler_check(handler, wid)) { available = g_content_resolver_get_all(resolver, wid, &count); -- cgit v0.11.2-87-g4458