From 69f32ba7c947dce0f0dd9615e937ec073bee466b Mon Sep 17 00:00:00 2001 From: Tim Janik Date: Mon, 2 Jul 2001 05:02:13 +0000 Subject: [PATCH] added g_list_insert_before(). Sat Jun 30 23:14:32 2001 Tim Janik * glib/glist.[hc]: added g_list_insert_before(). * glib/gslist.c (g_slist_insert_before): provide an implementation, prototype was already present... Sat Jun 30 11:07:00 2001 Tim Janik * gobject.[hc]: provide weak_ref/weak_unref functions, invoked from ->dispose. renamed ->shutdown() to ->dispose(), provide "public" API entry here: g_object_run_dispose(), this fucntion should _only_ be called from object system implementations (e.g. gtkobject.c) if at all. * gtypemodule.c (g_type_module_dispose): s/shutdown/dispose/ * gsignal.h: removed compat aliases. * gobject.c (g_object_connect): support data objects. --- ChangeLog | 7 + ChangeLog.pre-2-0 | 7 + ChangeLog.pre-2-10 | 7 + ChangeLog.pre-2-12 | 7 + ChangeLog.pre-2-2 | 7 + ChangeLog.pre-2-4 | 7 + ChangeLog.pre-2-6 | 7 + ChangeLog.pre-2-8 | 7 + .../gobject/tmpl/gobject-unused.sgml | 17 ++ docs/reference/gobject/tmpl/signals.sgml | 19 -- glib/glist.c | 50 ++++ glib/glist.h | 3 + glib/gslist.c | 39 +++ gobject/ChangeLog | 14 ++ gobject/gobject.c | 222 +++++++++++++----- gobject/gobject.h | 21 +- gobject/gsignal.h | 9 - gobject/gtype.h | 2 +- gobject/gtypemodule.c | 12 +- 19 files changed, 370 insertions(+), 94 deletions(-) diff --git a/ChangeLog b/ChangeLog index 5223eb4f2..80dbed0f5 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +Sat Jun 30 23:14:32 2001 Tim Janik + + * glib/glist.[hc]: added g_list_insert_before(). + + * glib/gslist.c (g_slist_insert_before): provide an implementation, + prototype was already present... + Sun Jul 1 20:16:25 2001 Owen Taylor * glib/guniprop.c (g_unichar_totitle): Use G_N_ELEMENTS diff --git a/ChangeLog.pre-2-0 b/ChangeLog.pre-2-0 index 5223eb4f2..80dbed0f5 100644 --- a/ChangeLog.pre-2-0 +++ b/ChangeLog.pre-2-0 @@ -1,3 +1,10 @@ +Sat Jun 30 23:14:32 2001 Tim Janik + + * glib/glist.[hc]: added g_list_insert_before(). + + * glib/gslist.c (g_slist_insert_before): provide an implementation, + prototype was already present... + Sun Jul 1 20:16:25 2001 Owen Taylor * glib/guniprop.c (g_unichar_totitle): Use G_N_ELEMENTS diff --git a/ChangeLog.pre-2-10 b/ChangeLog.pre-2-10 index 5223eb4f2..80dbed0f5 100644 --- a/ChangeLog.pre-2-10 +++ b/ChangeLog.pre-2-10 @@ -1,3 +1,10 @@ +Sat Jun 30 23:14:32 2001 Tim Janik + + * glib/glist.[hc]: added g_list_insert_before(). + + * glib/gslist.c (g_slist_insert_before): provide an implementation, + prototype was already present... + Sun Jul 1 20:16:25 2001 Owen Taylor * glib/guniprop.c (g_unichar_totitle): Use G_N_ELEMENTS diff --git a/ChangeLog.pre-2-12 b/ChangeLog.pre-2-12 index 5223eb4f2..80dbed0f5 100644 --- a/ChangeLog.pre-2-12 +++ b/ChangeLog.pre-2-12 @@ -1,3 +1,10 @@ +Sat Jun 30 23:14:32 2001 Tim Janik + + * glib/glist.[hc]: added g_list_insert_before(). + + * glib/gslist.c (g_slist_insert_before): provide an implementation, + prototype was already present... + Sun Jul 1 20:16:25 2001 Owen Taylor * glib/guniprop.c (g_unichar_totitle): Use G_N_ELEMENTS diff --git a/ChangeLog.pre-2-2 b/ChangeLog.pre-2-2 index 5223eb4f2..80dbed0f5 100644 --- a/ChangeLog.pre-2-2 +++ b/ChangeLog.pre-2-2 @@ -1,3 +1,10 @@ +Sat Jun 30 23:14:32 2001 Tim Janik + + * glib/glist.[hc]: added g_list_insert_before(). + + * glib/gslist.c (g_slist_insert_before): provide an implementation, + prototype was already present... + Sun Jul 1 20:16:25 2001 Owen Taylor * glib/guniprop.c (g_unichar_totitle): Use G_N_ELEMENTS diff --git a/ChangeLog.pre-2-4 b/ChangeLog.pre-2-4 index 5223eb4f2..80dbed0f5 100644 --- a/ChangeLog.pre-2-4 +++ b/ChangeLog.pre-2-4 @@ -1,3 +1,10 @@ +Sat Jun 30 23:14:32 2001 Tim Janik + + * glib/glist.[hc]: added g_list_insert_before(). + + * glib/gslist.c (g_slist_insert_before): provide an implementation, + prototype was already present... + Sun Jul 1 20:16:25 2001 Owen Taylor * glib/guniprop.c (g_unichar_totitle): Use G_N_ELEMENTS diff --git a/ChangeLog.pre-2-6 b/ChangeLog.pre-2-6 index 5223eb4f2..80dbed0f5 100644 --- a/ChangeLog.pre-2-6 +++ b/ChangeLog.pre-2-6 @@ -1,3 +1,10 @@ +Sat Jun 30 23:14:32 2001 Tim Janik + + * glib/glist.[hc]: added g_list_insert_before(). + + * glib/gslist.c (g_slist_insert_before): provide an implementation, + prototype was already present... + Sun Jul 1 20:16:25 2001 Owen Taylor * glib/guniprop.c (g_unichar_totitle): Use G_N_ELEMENTS diff --git a/ChangeLog.pre-2-8 b/ChangeLog.pre-2-8 index 5223eb4f2..80dbed0f5 100644 --- a/ChangeLog.pre-2-8 +++ b/ChangeLog.pre-2-8 @@ -1,3 +1,10 @@ +Sat Jun 30 23:14:32 2001 Tim Janik + + * glib/glist.[hc]: added g_list_insert_before(). + + * glib/gslist.c (g_slist_insert_before): provide an implementation, + prototype was already present... + Sun Jul 1 20:16:25 2001 Owen Taylor * glib/guniprop.c (g_unichar_totitle): Use G_N_ELEMENTS diff --git a/docs/reference/gobject/tmpl/gobject-unused.sgml b/docs/reference/gobject/tmpl/gobject-unused.sgml index fcb15763b..01359274a 100644 --- a/docs/reference/gobject/tmpl/gobject-unused.sgml +++ b/docs/reference/gobject/tmpl/gobject-unused.sgml @@ -61,6 +61,23 @@ @closure: @Returns: + + + + + +@Returns: +@signal_name: +@itype: +@signal_flags: +@class_offset: +@accumulator: +@accu_data: +@c_marshaller: +@return_type: +@n_params: +@Varargs: + Determines if @value is a #GValue whose type conforms to @type. diff --git a/docs/reference/gobject/tmpl/signals.sgml b/docs/reference/gobject/tmpl/signals.sgml index be5843e09..0b42ec896 100644 --- a/docs/reference/gobject/tmpl/signals.sgml +++ b/docs/reference/gobject/tmpl/signals.sgml @@ -207,25 +207,6 @@ filled in by the g_signal_query() function. - - - - - -@Returns: - -@signal_name: -@itype: -@signal_flags: -@class_offset: -@accumulator: -@accu_data: -@c_marshaller: -@return_type: -@n_params: -@Varargs: - - diff --git a/glib/glist.c b/glib/glist.c index 7c59697c9..3935cb1b1 100644 --- a/glib/glist.c +++ b/glib/glist.c @@ -317,6 +317,56 @@ g_list_insert (GList *list, return list; } +GList* +g_list_insert_before (GList *list, + GList *sibling, + gpointer data) +{ + if (!list) + { + list = g_list_alloc (); + list->data = data; + g_return_val_if_fail (sibling == NULL, list); + return list; + } + else if (sibling) + { + GList *node; + + node = g_list_alloc (); + node->data = data; + if (sibling->prev) + { + node->prev = sibling->prev; + node->prev->next = node; + node->next = sibling; + sibling->prev = node; + return list; + } + else + { + node->next = sibling; + sibling->prev = node; + g_return_val_if_fail (sibling == list, node); + return node; + } + } + else + { + GList *last; + + last = list; + while (last->next) + last = last->next; + + last->next = g_list_alloc (); + last->next->data = data; + last->next->prev = last; + + return list; + } +} + GList * g_list_concat (GList *list1, GList *list2) { diff --git a/glib/glist.h b/glib/glist.h index bd165d417..e434d6951 100644 --- a/glib/glist.h +++ b/glib/glist.h @@ -57,6 +57,9 @@ GList* g_list_insert (GList *list, GList* g_list_insert_sorted (GList *list, gpointer data, GCompareFunc func); +GList* g_list_insert_before (GList *list, + GList *sibling, + gpointer data); GList* g_list_concat (GList *list1, GList *list2); GList* g_list_remove (GList *list, diff --git a/glib/gslist.c b/glib/gslist.c index 4dafb98be..18e08e42d 100644 --- a/glib/gslist.c +++ b/glib/gslist.c @@ -307,6 +307,45 @@ g_slist_insert (GSList *list, return list; } +GSList* +g_slist_insert_before (GSList *slist, + GSList *sibling, + gpointer data) +{ + if (!slist) + { + slist = g_slist_alloc (); + slist->data = data; + g_return_val_if_fail (sibling == NULL, slist); + return slist; + } + else + { + GSList *node, *last = NULL; + + for (node = slist; node; last = node, node = last->next) + if (node == sibling) + break; + if (!last) + { + node = g_slist_alloc (); + node->data = data; + node->next = slist; + + return node; + } + else + { + node = g_slist_alloc (); + node->data = data; + node->next = last->next; + last->next = node; + + return slist; + } + } +} + GSList * g_slist_concat (GSList *list1, GSList *list2) { diff --git a/gobject/ChangeLog b/gobject/ChangeLog index 0134bc6d1..57c5e272b 100644 --- a/gobject/ChangeLog +++ b/gobject/ChangeLog @@ -1,3 +1,17 @@ +Sat Jun 30 11:07:00 2001 Tim Janik + + * gobject.[hc]: provide weak_ref/weak_unref functions, + invoked from ->dispose. renamed ->shutdown() to ->dispose(), + provide "public" API entry here: g_object_run_dispose(), this + fucntion should _only_ be called from object system implementations + (e.g. gtkobject.c) if at all. + + * gtypemodule.c (g_type_module_dispose): s/shutdown/dispose/ + + * gsignal.h: removed compat aliases. + + * gobject.c (g_object_connect): support data objects. + Sat Jun 30 13:17:12 2001 Owen Taylor * testgruntime.c (test_object_class_init) diff --git a/gobject/gobject.c b/gobject/gobject.c index 0a7a8f216..bdcd815da 100644 --- a/gobject/gobject.c +++ b/gobject/gobject.c @@ -61,7 +61,7 @@ static GObject* g_object_constructor (GType type, guint n_construct_properties, GObjectConstructParam *construct_params); static void g_object_last_unref (GObject *object); -static void g_object_shutdown (GObject *object); +static void g_object_real_dispose (GObject *object); static void g_object_finalize (GObject *object); static void g_object_do_set_property (GObject *object, guint property_id, @@ -103,6 +103,7 @@ static inline void object_set_property (GObject *object, /* --- variables --- */ static GQuark quark_closure_array = 0; +static GQuark quark_weak_refs = 0; static GParamSpecPool *pspec_pool = NULL; static GObjectNotifyContext property_notify_context = { 0, }; static gulong gobject_signals[LAST_SIGNAL] = { 0, }; @@ -133,11 +134,8 @@ debug_objects_atexit (void) IF_DEBUG (OBJECTS) { G_LOCK (debug_objects); - if (debug_objects_ht) - { - g_message ("stale GObjects: %u", debug_objects_count); - g_hash_table_foreach (debug_objects_ht, debug_objects_foreach, NULL); - } + g_message ("stale GObjects: %u", debug_objects_count); + g_hash_table_foreach (debug_objects_ht, debug_objects_foreach, NULL); G_UNLOCK (debug_objects); } } @@ -186,7 +184,10 @@ g_object_type_init (void) /* sync with gtype.c */ #ifdef G_ENABLE_DEBUG IF_DEBUG (OBJECTS) - g_atexit (debug_objects_atexit); + { + debug_objects_ht = g_hash_table_new (g_direct_hash, NULL); + g_atexit (debug_objects_atexit); + } #endif /* G_ENABLE_DEBUG */ } @@ -236,6 +237,7 @@ static void g_object_do_class_init (GObjectClass *class) { quark_closure_array = g_quark_from_static_string ("GObject-closure-array"); + quark_weak_refs = g_quark_from_static_string ("GObject-weak-references"); pspec_pool = g_param_spec_pool_new (TRUE); property_notify_context.quark_notify_queue = g_quark_from_static_string ("GObject-notify-queue"); property_notify_context.dispatcher = g_object_notify_dispatcher; @@ -243,7 +245,7 @@ g_object_do_class_init (GObjectClass *class) class->constructor = g_object_constructor; class->set_property = g_object_do_set_property; class->get_property = g_object_do_get_property; - class->shutdown = g_object_shutdown; + class->dispose = g_object_real_dispose; class->finalize = g_object_finalize; class->dispatch_properties_changed = g_object_dispatch_properties_changed; class->notify = NULL; @@ -344,8 +346,6 @@ g_object_init (GObject *object) IF_DEBUG (OBJECTS) { G_LOCK (debug_objects); - if (!debug_objects_ht) - debug_objects_ht = g_hash_table_new (g_direct_hash, NULL); debug_objects_count++; g_hash_table_insert (debug_objects_ht, object, object); G_UNLOCK (debug_objects); @@ -382,51 +382,25 @@ g_object_do_get_property (GObject *object, } static void -g_object_last_unref (GObject *object) +g_object_real_dispose (GObject *object) { - g_return_if_fail (object->ref_count > 0); - - if (object->ref_count == 1) /* may have been re-referenced meanwhile */ - G_OBJECT_GET_CLASS (object)->shutdown (object); - -#ifdef G_ENABLE_DEBUG - if (g_trap_object_ref == object) - G_BREAKPOINT (); -#endif /* G_ENABLE_DEBUG */ + guint ref_count; - object->ref_count -= 1; - - if (object->ref_count == 0) /* may have been re-referenced meanwhile */ - { - g_signal_handlers_destroy (object); - g_object_set_qdata (object, quark_closure_array, NULL); - G_OBJECT_GET_CLASS (object)->finalize (object); -#ifdef G_ENABLE_DEBUG - IF_DEBUG (OBJECTS) - { - G_LOCK (debug_objects); - if (debug_objects_ht) - g_assert (g_hash_table_lookup (debug_objects_ht, object) == NULL); - G_UNLOCK (debug_objects); - } -#endif /* G_ENABLE_DEBUG */ - g_type_free_instance ((GTypeInstance*) object); - } -} + g_signal_handlers_destroy (object); + g_datalist_id_set_data (&object->qdata, quark_closure_array, NULL); -static void -g_object_shutdown (GObject *object) -{ - /* this function needs to be always present for unconditional - * chaining, we also might add some code here later. - * beware though, subclasses may invoke shutdown() arbitrarily. + /* yes, temporarily altering the ref_count is hackish, but that + * enforces people not jerking around with weak_ref notifiers */ + ref_count = object->ref_count; + object->ref_count = 0; + g_datalist_id_set_data (&object->qdata, quark_weak_refs, NULL); + object->ref_count = ref_count; } static void g_object_finalize (GObject *object) { - g_signal_handlers_destroy (object); g_datalist_clear (&object->qdata); #ifdef G_ENABLE_DEBUG @@ -441,6 +415,38 @@ g_object_finalize (GObject *object) #endif /* G_ENABLE_DEBUG */ } +static void +g_object_last_unref (GObject *object) +{ + g_return_if_fail (object->ref_count > 0); + + if (object->ref_count == 1) /* may have been re-referenced meanwhile */ + G_OBJECT_GET_CLASS (object)->dispose (object); + +#ifdef G_ENABLE_DEBUG + if (g_trap_object_ref == object) + G_BREAKPOINT (); +#endif /* G_ENABLE_DEBUG */ + + object->ref_count -= 1; + + if (object->ref_count == 0) /* may have been re-referenced meanwhile */ + { + g_datalist_id_set_data (&object->qdata, quark_weak_refs, NULL); + G_OBJECT_GET_CLASS (object)->finalize (object); +#ifdef G_ENABLE_DEBUG + IF_DEBUG (OBJECTS) + { + /* catch objects not chaining finalize handlers */ + G_LOCK (debug_objects); + g_assert (g_hash_table_lookup (debug_objects_ht, object) == NULL); + G_UNLOCK (debug_objects); + } +#endif /* G_ENABLE_DEBUG */ + g_type_free_instance ((GTypeInstance*) object); + } +} + static void g_object_dispatch_properties_changed (GObject *object, guint n_pspecs, @@ -452,6 +458,17 @@ g_object_dispatch_properties_changed (GObject *object, g_signal_emit (object, gobject_signals[NOTIFY], g_quark_from_string (pspecs[i]->name), pspecs[i]); } +void +g_object_run_dispose (GObject *object) +{ + g_return_if_fail (G_IS_OBJECT (object)); + g_return_if_fail (object->ref_count > 0); + + g_object_ref (object); + G_OBJECT_GET_CLASS (object)->dispose (object); + g_object_unref (object); +} + void g_object_freeze_notify (GObject *object) { @@ -1068,24 +1085,40 @@ g_object_connect (gpointer _object, { gpointer callback = va_arg (var_args, gpointer); gpointer data = va_arg (var_args, gpointer); - guint sid; + gulong sid; if (strncmp (signal_spec, "signal::", 8) == 0) sid = g_signal_connect_data (object, signal_spec + 8, callback, data, NULL, 0); + else if (strncmp (signal_spec, "object_signal::", 15) == 0) + sid = g_signal_connect_object (object, signal_spec + 15, + callback, data, + 0); else if (strncmp (signal_spec, "swapped_signal::", 16) == 0) sid = g_signal_connect_data (object, signal_spec + 16, callback, data, NULL, G_CONNECT_SWAPPED); + else if (strncmp (signal_spec, "swapped_object_signal::", 23) == 0) + sid = g_signal_connect_object (object, signal_spec + 23, + callback, data, + G_CONNECT_SWAPPED); else if (strncmp (signal_spec, "signal_after::", 14) == 0) sid = g_signal_connect_data (object, signal_spec + 14, callback, data, NULL, G_CONNECT_AFTER); + else if (strncmp (signal_spec, "object_signal_after::", 21) == 0) + sid = g_signal_connect_object (object, signal_spec + 21, + callback, data, + G_CONNECT_AFTER); else if (strncmp (signal_spec, "swapped_signal_after::", 22) == 0) sid = g_signal_connect_data (object, signal_spec + 22, callback, data, NULL, G_CONNECT_SWAPPED | G_CONNECT_AFTER); + else if (strncmp (signal_spec, "swapped_object_signal_after::", 29) == 0) + sid = g_signal_connect_object (object, signal_spec + 29, + callback, data, + G_CONNECT_SWAPPED | G_CONNECT_AFTER); else { g_warning ("%s: invalid signal spec \"%s\"", G_STRLOC, signal_spec); @@ -1146,6 +1179,88 @@ g_object_disconnect (gpointer _object, return object; } +typedef struct { + guint n_weak_refs; + struct { + GWeakNotify notify; + gpointer data; + } weak_refs[1]; /* flexible array */ +} WeakRefStack; + +static void +weak_refs_notify (gpointer data) +{ + WeakRefStack *wstack = data; + guint i; + + for (i = 0; i < wstack->n_weak_refs; i++) + wstack->weak_refs[i].notify (wstack->weak_refs[i].data); + g_free (wstack); +} + +void +g_object_weak_ref (GObject *object, + GWeakNotify notify, + gpointer data) +{ + WeakRefStack *wstack; + guint i; + + g_return_if_fail (G_IS_OBJECT (object)); + g_return_if_fail (notify != NULL); + g_return_if_fail (object->ref_count >= 1); + + wstack = g_datalist_id_remove_no_notify (&object->qdata, quark_weak_refs); + if (wstack) + { + i = wstack->n_weak_refs++; + wstack = g_realloc (wstack, sizeof (*wstack) + sizeof (wstack->weak_refs[0]) * i); + } + else + { + wstack = g_renew (WeakRefStack, NULL, 1); + wstack->n_weak_refs = 1; + i = wstack->n_weak_refs; + } + wstack->weak_refs[i].notify = notify; + wstack->weak_refs[i].data = data; + g_datalist_id_set_data_full (&object->qdata, quark_weak_refs, wstack, weak_refs_notify); +} + +void +g_object_weak_unref (GObject *object, + GWeakNotify notify, + gpointer data) +{ + WeakRefStack *wstack; + gboolean found_one = FALSE; + + g_return_if_fail (G_IS_OBJECT (object)); + g_return_if_fail (notify != NULL); + + wstack = g_datalist_id_get_data (&object->qdata, quark_weak_refs); + if (wstack) + { + guint i; + + for (i = 0; i < wstack->n_weak_refs; i++) + if (wstack->weak_refs[i].notify == notify && + wstack->weak_refs[i].data == data) + { + found_one = TRUE; + wstack->n_weak_refs -= 1; + if (i != wstack->n_weak_refs) + { + wstack->weak_refs[i].notify = wstack->weak_refs[wstack->n_weak_refs].notify; + wstack->weak_refs[i].data = wstack->weak_refs[wstack->n_weak_refs].data; + } + break; + } + } + if (!found_one) + g_warning (G_STRLOC ": couldn't find weak ref %p(%p)", notify, data); +} + gpointer g_object_ref (gpointer _object) { @@ -1482,6 +1597,7 @@ g_object_watch_closure (GObject *object, GClosure *closure) { CArray *carray; + guint i; g_return_if_fail (G_IS_OBJECT (object)); g_return_if_fail (closure != NULL); @@ -1493,23 +1609,21 @@ g_object_watch_closure (GObject *object, g_closure_add_marshal_guards (closure, object, (GClosureNotify) g_object_ref, object, (GClosureNotify) g_object_unref); - carray = g_object_steal_qdata (object, quark_closure_array); + carray = g_datalist_id_remove_no_notify (&object->qdata, quark_closure_array); if (!carray) { carray = g_renew (CArray, NULL, 1); carray->object = object; carray->n_closures = 1; - carray->closures[0] = closure; - g_object_set_qdata_full (object, quark_closure_array, carray, destroy_closure_array); + i = carray->n_closures; } else { - guint i = carray->n_closures++; - + i = carray->n_closures++; carray = g_realloc (carray, sizeof (*carray) + sizeof (carray->closures[0]) * i); - carray->closures[i] = closure; - g_object_set_qdata_full (object, quark_closure_array, carray, destroy_closure_array); } + carray->closures[i] = closure; + g_datalist_id_set_data_full (&object->qdata, quark_closure_array, carray, destroy_closure_array); } GClosure* diff --git a/gobject/gobject.h b/gobject/gobject.h index 819190456..43740f0e8 100644 --- a/gobject/gobject.h +++ b/gobject/gobject.h @@ -54,6 +54,7 @@ typedef void (*GObjectSetPropertyFunc) (GObject *object, const GValue *value, GParamSpec *pspec); typedef void (*GObjectFinalizeFunc) (GObject *object); +typedef void (*GWeakNotify) (gpointer data); struct _GObject { GTypeInstance g_type_instance; @@ -73,17 +74,17 @@ struct _GObjectClass GObject* (*constructor) (GType type, guint n_construct_properties, GObjectConstructParam *construct_properties); - void (*set_property) (GObject *object, + void (*set_property) (GObject *object, guint property_id, const GValue *value, GParamSpec *pspec); - void (*get_property) (GObject *object, + void (*get_property) (GObject *object, guint property_id, GValue *value, GParamSpec *pspec); - void (*shutdown) (GObject *object); - void (*finalize) (GObject *object); - + void (*dispose) (GObject *object); + void (*finalize) (GObject *object); + /* seldomly overidden */ void (*dispatch_properties_changed) (GObject *object, guint n_pspecs, @@ -147,6 +148,12 @@ void g_object_notify (GObject *object, void g_object_thaw_notify (GObject *object); gpointer g_object_ref (gpointer object); void g_object_unref (gpointer object); +void g_object_weak_ref (GObject *object, + GWeakNotify notify, + gpointer data); +void g_object_weak_unref (GObject *object, + GWeakNotify notify, + gpointer data); gpointer g_object_get_qdata (GObject *object, GQuark quark); void g_object_set_qdata (GObject *object, @@ -188,6 +195,10 @@ guint g_signal_connect_object (gpointer instance, GConnectFlags connect_flags); +/*< protected >*/ +void g_object_run_dispose (GObject *object); + + /* --- implementation macros --- */ #define G_OBJECT_WARN_INVALID_PSPEC(object, pname, property_id, pspec) \ G_STMT_START { \ diff --git a/gobject/gsignal.h b/gobject/gsignal.h index 8824eb440..774cfe85a 100644 --- a/gobject/gsignal.h +++ b/gobject/gsignal.h @@ -238,15 +238,6 @@ guint g_signal_handlers_disconnect_matched (gpointer instance, g_signal_handlers_unblock_matched ((instance), G_SIGNAL_MATCH_FUNC | G_SIGNAL_MATCH_DATA, \ 0, 0, NULL, (func), (data)) -#ifndef G_DISABLE_COMPAT -/* tmp compat, to be nuked soon */ -#define g_signal_connectc(instance, detailed_signal, c_handler, data, swapped) \ - g_signal_connect_data ((instance), (detailed_signal), (c_handler), (data), NULL, (swapped)?G_CONNECT_SWAPPED:0); -#define g_signal_newc g_signal_new -#define g_signal_disconnect_by_func g_signal_handlers_disconnect_by_func -#define g_signal_block_by_func g_signal_handlers_block_by_func -#define g_signal_unblock_by_func g_signal_handlers_unblock_by_func -#endif /*< private >*/ void g_signal_handlers_destroy (gpointer instance); diff --git a/gobject/gtype.h b/gobject/gtype.h index 9e85d9113..1640f08a0 100644 --- a/gobject/gtype.h +++ b/gobject/gtype.h @@ -171,7 +171,7 @@ struct _GTypeQuery #define G_TYPE_FROM_INTERFACE(g_iface) (((GTypeInterface*) (g_iface))->g_type) -/* debug flags for g_type_init() */ +/* debug flags for g_type_init_with_debug_flags() */ typedef enum /*< skip >*/ { G_TYPE_DEBUG_NONE = 0, diff --git a/gobject/gtypemodule.c b/gobject/gtypemodule.c index 7dd53a592..dbb66bd74 100644 --- a/gobject/gtypemodule.c +++ b/gobject/gtypemodule.c @@ -51,21 +51,21 @@ static void g_type_module_complete_interface_info (GTypePlugin *plugin, GType interface_type, GInterfaceInfo *info); -static GObjectClass *parent_class; +static gpointer parent_class = NULL; static void -g_type_module_shutdown (GObject *object) +g_type_module_dispose (GObject *object) { GTypeModule *module = G_TYPE_MODULE (object); if (module->type_infos || module->interface_infos) { - g_warning (G_STRLOC ": shutdown should never happen for static type plugins once types or interfaces have been registered"); + g_warning (G_STRLOC ": unsolicitated invocation of g_object_dispose() on GTypeModule"); g_object_ref (object); } - parent_class->shutdown (object); + G_OBJECT_CLASS (parent_class)->dispose (object); } static void @@ -75,7 +75,7 @@ g_type_module_finalize (GObject *object) g_free (module->name); - parent_class->finalize (object); + G_OBJECT_CLASS (parent_class)->finalize (object); } static void @@ -85,7 +85,7 @@ g_type_module_class_init (GTypeModuleClass *class) parent_class = G_OBJECT_CLASS (g_type_class_peek_parent (class)); - gobject_class->shutdown = g_type_module_shutdown; + gobject_class->dispose = g_type_module_dispose; gobject_class->finalize = g_type_module_finalize; }