diff options
author | Tim Janik <timj@gtk.org> | 1998-05-07 11:12:57 +0000 |
---|---|---|
committer | Tim Janik <timj@src.gnome.org> | 1998-05-07 11:12:57 +0000 |
commit | 2934f4f58cb4dfa06669d46bb16b72f478b17cda (patch) | |
tree | 9275dc47285c6fba6e5e8a0bc6ac84af69e28a49 /gtk/gtkobject.c | |
parent | 8460f39363f2cfe6b6e03796baa776050afe34da (diff) | |
download | gtk+-2934f4f58cb4dfa06669d46bb16b72f478b17cda.tar.gz |
allocate object data chunks through a global object data structure list.
Thu May 7 12:52:45 1998 Tim Janik <timj@gtk.org>
* gtk/gtkobject.c (gtk_object_set_data_by_id_full): allocate object
data chunks through a global object data structure list. unlink
object data before invoking its destroy function.
(gtk_object_finalize): slight modification to allow usage of object
data during object finalization.
Diffstat (limited to 'gtk/gtkobject.c')
-rw-r--r-- | gtk/gtkobject.c | 98 |
1 files changed, 59 insertions, 39 deletions
diff --git a/gtk/gtkobject.c b/gtk/gtkobject.c index 1b50af14b3..b6197c9730 100644 --- a/gtk/gtkobject.c +++ b/gtk/gtkobject.c @@ -24,8 +24,8 @@ #include "gtksignal.h" -#define OBJECT_DATA_ID_CHUNK 1024 - +#define GTK_OBJECT_DATA_ID_BLOCK_SIZE (1024) +#define GTK_OBJECT_DATA_BLOCK_SIZE (1024) enum { DESTROY, @@ -74,7 +74,6 @@ static void gtk_object_real_destroy (GtkObject *object); static void gtk_object_finalize (GtkObject *object); static void gtk_object_notify_weaks (GtkObject *object); -static void gtk_object_data_destroy (GtkObjectData *odata); static guint* gtk_object_data_id_alloc (void); GtkArg* gtk_object_collect_args (guint *nargs, @@ -83,11 +82,6 @@ GtkArg* gtk_object_collect_args (guint *nargs, static guint object_signals[LAST_SIGNAL] = { 0 }; -static GHashTable *object_data_ht = NULL; -static GMemChunk *object_data_mem_chunk = NULL; -static GSList *object_data_id_list = NULL; -static guint object_data_id_index = 0; - static GHashTable *arg_info_ht = NULL; static const gchar *user_data_key = "user_data"; @@ -95,6 +89,19 @@ static guint user_data_key_id = 0; static const gchar *weakrefs_key = "gtk-weakrefs"; static guint weakrefs_key_id = 0; +static GHashTable *object_data_ht = NULL; +static GSList *object_data_id_list = NULL; +static guint object_data_id_index = 0; +static GtkObjectData *gtk_object_data_free_list = NULL; + +#define GTK_OBJECT_DATA_DESTROY( odata ) { \ + if (odata->destroy) \ + odata->destroy (odata->data); \ + odata->next = gtk_object_data_free_list; \ + gtk_object_data_free_list = odata; \ +} + + #ifdef G_ENABLE_DEBUG static guint obj_count = 0; static GHashTable *living_objs_ht = NULL; @@ -259,16 +266,15 @@ gtk_object_real_destroy (GtkObject *object) static void gtk_object_finalize (GtkObject *object) { - GtkObjectData *odata, *next; - gtk_object_notify_weaks (object); - odata = object->object_data; - while (odata) + while (object->object_data) { - next = odata->next; - gtk_object_data_destroy (odata); - odata = next; + GtkObjectData *odata; + + odata = object->object_data; + object->object_data = odata->next; + GTK_OBJECT_DATA_DESTROY (odata); } g_free (object); @@ -996,11 +1002,11 @@ gtk_object_set_data_by_id_full (GtkObject *object, g_return_if_fail (object != NULL); g_return_if_fail (GTK_IS_OBJECT (object)); g_return_if_fail (data_id > 0); - + + odata = object->object_data; if (!data) { prev = NULL; - odata = object->object_data; while (odata) { @@ -1008,10 +1014,10 @@ gtk_object_set_data_by_id_full (GtkObject *object, { if (prev) prev->next = odata->next; - if (odata == object->object_data) + else object->object_data = odata->next; - gtk_object_data_destroy (odata); + GTK_OBJECT_DATA_DESTROY (odata); break; } @@ -1021,13 +1027,24 @@ gtk_object_set_data_by_id_full (GtkObject *object, } else { - odata = object->object_data; while (odata) { if (odata->id == data_id) { + /* we need to be unlinked while invoking the destroy function + */ if (odata->destroy) - odata->destroy (odata->data); + { + if (prev) + prev->next = odata->next; + else + object->object_data = odata->next; + + odata->destroy (odata->data); + + odata->next = object->object_data; + object->object_data = odata; + } odata->data = data; odata->destroy = destroy; @@ -1037,12 +1054,26 @@ gtk_object_set_data_by_id_full (GtkObject *object, odata = odata->next; } - if (!object_data_mem_chunk) - object_data_mem_chunk = g_mem_chunk_new ("object data mem chunk", - sizeof (GtkObjectData), - 1024, G_ALLOC_AND_FREE); + if (gtk_object_data_free_list) + { + odata = gtk_object_data_free_list; + gtk_object_data_free_list = odata->next; + } + else + { + GtkObjectData *odata_block; + guint i; + + odata_block = g_new0 (GtkObjectData, GTK_OBJECT_DATA_BLOCK_SIZE); + for (i = 1; i < GTK_OBJECT_DATA_BLOCK_SIZE; i++) + { + (odata_block + i)->next = gtk_object_data_free_list; + gtk_object_data_free_list = (odata_block + i); + } + + odata = odata_block; + } - odata = g_chunk_new (GtkObjectData, object_data_mem_chunk); odata->id = data_id; odata->data = data; odata->destroy = destroy; @@ -1159,17 +1190,6 @@ gtk_object_remove_data (GtkObject *object, gtk_object_set_data_by_id_full (object, id, NULL, NULL); } -static void -gtk_object_data_destroy (GtkObjectData *odata) -{ - g_return_if_fail (odata != NULL); - - if (odata->destroy) - odata->destroy (odata->data); - - g_mem_chunk_free (object_data_mem_chunk, odata); -} - static guint* gtk_object_data_id_alloc (void) { @@ -1177,9 +1197,9 @@ gtk_object_data_id_alloc (void) guint *ids; if (!object_data_id_list || - (object_data_id_index == OBJECT_DATA_ID_CHUNK)) + (object_data_id_index == GTK_OBJECT_DATA_ID_BLOCK_SIZE)) { - ids = g_new (guint, OBJECT_DATA_ID_CHUNK); + ids = g_new (guint, GTK_OBJECT_DATA_ID_BLOCK_SIZE); object_data_id_index = 0; object_data_id_list = g_slist_prepend (object_data_id_list, ids); } |