From fa4de0b3ae03ad440a311148b18509c6ee7470b6 Mon Sep 17 00:00:00 2001 From: Cyrille Bagard Date: Wed, 9 May 2018 16:06:57 +0200 Subject: Fixed a memory leak when deleting work groups. --- src/glibext/delayed.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/glibext/delayed.c b/src/glibext/delayed.c index 9bac68a..e93edc2 100644 --- a/src/glibext/delayed.c +++ b/src/glibext/delayed.c @@ -498,7 +498,7 @@ static void g_work_group_finalize(GWorkGroup *group) /****************************************************************************** * * -* Paramètres : type = type dont seront marqués tous les travaux donnés. * +* Paramètres : id = identifiant accordé au nouveau groupe. * * * * Description : Crée un nouveau thread dédié à un type de travaux donné. * * * @@ -1021,6 +1021,7 @@ wgroup_id_t g_work_queue_define_work_group(GWorkQueue *queue) void g_work_queue_delete_work_group(GWorkQueue *queue, wgroup_id_t id) { size_t i; /* Boucle de parcours */ + GWorkGroup *group; /* Groupe de travail manipulé */ #ifndef NDEBUG bool found; /* Repérage du groupe visé */ #endif @@ -1032,8 +1033,13 @@ void g_work_queue_delete_work_group(GWorkQueue *queue, wgroup_id_t id) g_mutex_lock(&queue->mutex); for (i = 0; i < queue->groups_count; i++) - if (g_work_group_get_id(queue->groups[i]) == id) + { + group = queue->groups[i]; + + if (g_work_group_get_id(group) == id) { + g_object_unref(G_OBJECT(group)); + memmove(&queue->groups[i], &queue->groups[i + 1], (queue->groups_count - i - 1) * sizeof(GWorkGroup *)); @@ -1049,6 +1055,8 @@ void g_work_queue_delete_work_group(GWorkQueue *queue, wgroup_id_t id) } + } + assert(found); g_cond_broadcast(&queue->wait_all); -- cgit v0.11.2-87-g4458