summaryrefslogtreecommitdiff
path: root/src/glibext
diff options
context:
space:
mode:
Diffstat (limited to 'src/glibext')
-rw-r--r--src/glibext/gbufferview.c9
-rw-r--r--src/glibext/linesegment.c53
-rw-r--r--src/glibext/linesegment.h6
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 *);