summaryrefslogtreecommitdiff
path: root/gtk/gtkobject.c
diff options
context:
space:
mode:
authorTim Janik <timj@gtk.org>1998-05-07 11:12:57 +0000
committerTim Janik <timj@src.gnome.org>1998-05-07 11:12:57 +0000
commit2934f4f58cb4dfa06669d46bb16b72f478b17cda (patch)
tree9275dc47285c6fba6e5e8a0bc6ac84af69e28a49 /gtk/gtkobject.c
parent8460f39363f2cfe6b6e03796baa776050afe34da (diff)
downloadgtk+-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.c98
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);
}