diff options
Diffstat (limited to 'src/glibext')
-rw-r--r-- | src/glibext/gbufferview.c | 9 | ||||
-rw-r--r-- | src/glibext/linesegment.c | 53 | ||||
-rw-r--r-- | src/glibext/linesegment.h | 6 |
3 files changed, 62 insertions, 6 deletions
diff --git a/src/glibext/gbufferview.c b/src/glibext/gbufferview.c index f5adc9d..2239d23 100644 --- a/src/glibext/gbufferview.c +++ b/src/glibext/gbufferview.c @@ -36,7 +36,6 @@ struct _GBufferView GBufferCache *cache; /* Tampon du contenu visualisé */ segcnt_list *highlighted; /* Segments mis en évidence */ - bool external; /* Note l'origine de la liste */ bool unrestricted; /* Validité des informations */ GLineCursor *start; /* Première ligne intégrée */ @@ -189,8 +188,7 @@ static void g_buffer_view_dispose(GBufferView *view) static void g_buffer_view_finalize(GBufferView *view) { - if (!view->external) - exit_segment_content_list(view->highlighted); + unref_segment_content_list(view->highlighted); G_OBJECT_CLASS(g_buffer_view_parent_class)->finalize(G_OBJECT(view)); @@ -223,12 +221,13 @@ GBufferView *g_buffer_view_new(GBufferCache *cache, segcnt_list *highlighted) g_signal_connect(cache, "size-changed", G_CALLBACK(on_buffer_cache_size_changed), result); if (highlighted != NULL) + { + ref_segment_content_list(highlighted); result->highlighted = highlighted; + } else result->highlighted = init_segment_content_list(); - result->external = (highlighted != NULL); - return result; } diff --git a/src/glibext/linesegment.c b/src/glibext/linesegment.c index 557dff2..15fde78 100644 --- a/src/glibext/linesegment.c +++ b/src/glibext/linesegment.c @@ -148,6 +148,8 @@ struct _segcnt_list fnv64_t *hashes; /* Empreinte pour comparaisons */ size_t count; /* Nommbre de ces empreintes */ + unsigned int ref_count; /* Compteur de références */ + }; @@ -970,7 +972,12 @@ segcnt_list *init_segment_content_list(void) { segcnt_list *result; /* Structure à retourner */ - result = (segcnt_list *)calloc(1, sizeof(segcnt_list)); + result = malloc(sizeof(segcnt_list)); + + result->hashes = NULL; + result->count = 0; + + result->ref_count = 1; return result; @@ -991,6 +998,8 @@ segcnt_list *init_segment_content_list(void) void exit_segment_content_list(segcnt_list *list) { + assert(list->ref_count == 0); + reset_segment_content_list(list); free(list); @@ -1000,6 +1009,48 @@ void exit_segment_content_list(segcnt_list *list) /****************************************************************************** * * +* Paramètres : list = ensemble de références de contenus à traiter. * +* * +* Description : Incrémente le nombre d'utilisation de la liste de contenus. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +void ref_segment_content_list(segcnt_list *list) +{ + assert(list->ref_count > 0); + + list->ref_count++; + +} + + +/****************************************************************************** +* * +* Paramètres : list = ensemble de références de contenus à traiter. * +* * +* Description : Décrémente le nombre d'utilisation de la liste de contenus. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +void unref_segment_content_list(segcnt_list *list) +{ + assert(list->ref_count > 0); + + list->ref_count--; + +} + + +/****************************************************************************** +* * * Paramètres : list = ensemble de références de contenus à manipuler. * * * * Description : Vide, si besoin est, une liste de contenus de segments. * diff --git a/src/glibext/linesegment.h b/src/glibext/linesegment.h index c6deb38..9723a80 100644 --- a/src/glibext/linesegment.h +++ b/src/glibext/linesegment.h @@ -191,6 +191,12 @@ segcnt_list *init_segment_content_list(void); /* Libère la mémoire occupée par une liste de contenus. */ void exit_segment_content_list(segcnt_list *); +/* Incrémente le nombre d'utilisation de la liste de contenus. */ +void ref_segment_content_list(segcnt_list *); + +/* Décrémente le nombre d'utilisation de la liste de contenus. */ +void unref_segment_content_list(segcnt_list *); + /* Vide, si besoin est, une liste de contenus de segments. */ bool reset_segment_content_list(segcnt_list *); |