[glib/wip/gcleanup: 33/78] gatomicarray: Support for cleaning up
- From: Stefan Walter <stefw src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [glib/wip/gcleanup: 33/78] gatomicarray: Support for cleaning up
- Date: Tue, 12 Nov 2013 05:29:53 +0000 (UTC)
commit f4f8d3fc2499b858c4d670c8a93460337f0f1263
Author: Stef Walter <stefw gnome org>
Date: Thu Nov 7 22:42:39 2013 +0100
gatomicarray: Support for cleaning up
Cleanup atomic array manually as very last thing
Otherwise we keep putting stuff in freelist during cleanup.
Initial work by: Dan Winship <danw gnome org>
https://bugzilla.gnome.org/show_bug.cgi?id=711778
gobject/gatomicarray.c | 32 +++++++++++++++++++++++++++++++-
gobject/gatomicarray.h | 2 ++
2 files changed, 33 insertions(+), 1 deletions(-)
---
diff --git a/gobject/gatomicarray.c b/gobject/gatomicarray.c
index 77966f2..99019fe 100644
--- a/gobject/gatomicarray.c
+++ b/gobject/gatomicarray.c
@@ -50,6 +50,9 @@ struct _FreeListNode {
FreeListNode *next;
};
+#define G_ATOMIC_ARRAY_REAL_SIZE_FROM(size) \
+ sizeof (gsize) + MAX (size, sizeof (FreeListNode))
+
/* This is really a list of array memory blocks, using the
* first item as the next pointer to chain them together.
* Protected by array lock */
@@ -75,13 +78,33 @@ freelist_alloc (gsize size, gboolean reuse)
}
}
- real_size = sizeof (gsize) + MAX (size, sizeof (FreeListNode));
+ real_size = G_ATOMIC_ARRAY_REAL_SIZE_FROM (size);
mem = g_slice_alloc (real_size);
mem = ((char *) mem) + sizeof (gsize);
G_ATOMIC_ARRAY_DATA_SIZE (mem) = size;
return mem;
}
+void
+_g_atomic_array_cleanup (void)
+{
+ FreeListNode *cur, *next;
+
+ cur = freelist;
+ freelist = NULL;
+
+ for (; cur; cur = next)
+ {
+ gsize size, real_size;
+
+ next = cur->next;
+
+ size = G_ATOMIC_ARRAY_DATA_SIZE (cur);
+ real_size = G_ATOMIC_ARRAY_REAL_SIZE_FROM (size);
+ g_slice_free1 (real_size, ((char *) cur) - sizeof (gsize));
+ }
+}
+
/* must hold array lock */
static void
freelist_free (gpointer mem)
@@ -166,3 +189,10 @@ _g_atomic_array_update (GAtomicArray *array,
freelist_free (old);
G_UNLOCK (array);
}
+
+void
+_g_atomic_array_free (GAtomicArray *array)
+{
+ if (array->data != NULL)
+ freelist_free (array->data);
+}
diff --git a/gobject/gatomicarray.h b/gobject/gatomicarray.h
index b2ad970..79a87d8 100644
--- a/gobject/gatomicarray.h
+++ b/gobject/gatomicarray.h
@@ -35,11 +35,13 @@ struct _GAtomicArray {
};
void _g_atomic_array_init (GAtomicArray *array);
+void _g_atomic_array_free (GAtomicArray *array);
gpointer _g_atomic_array_copy (GAtomicArray *array,
gsize header_size,
gsize additional_element_size);
void _g_atomic_array_update (GAtomicArray *array,
gpointer new_data);
+void _g_atomic_array_cleanup(void);
#define G_ATOMIC_ARRAY_GET_LOCKED(_array, _type) ((_type *)((_array)->data))
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]