Index: GObject.xs =================================================================== RCS file: /cvsroot/gtk2-perl/gtk2-perl-xs/Glib/GObject.xs,v retrieving revision 1.74 diff -u -d -p -r1.74 GObject.xs --- GObject.xs 8 Jan 2008 05:58:56 -0000 1.74 +++ GObject.xs 27 Mar 2008 21:28:33 -0000 @@ -770,13 +770,19 @@ gperl_new_object (GObject * object, if(perl_gobject_tracking) { G_LOCK (perl_gobjects); -/*g_printerr ("adding object: 0x%p - %d\n", object, object->ref_count);*/ + if (!perl_gobjects) perl_gobjects = g_hash_table_new (g_direct_hash, g_direct_equal); - g_hash_table_insert (perl_gobjects, (gpointer)object, (gpointer)1); + +#ifdef NOISY + warn ("thread safety: inserting: 0x%p, 0x%p => 0x%p (%s)\n", + sv, obj, object, G_OBJECT_TYPE_NAME (object)); +#endif + g_hash_table_insert (perl_gobjects, sv, object); + G_UNLOCK (perl_gobjects); } -#endif +#endif /* GPERL_THREAD_SAFE */ return sv; } @@ -930,11 +936,19 @@ _gperl_fetch_wrapper_key (GObject * obje #if GPERL_THREAD_SAFE static void -_inc_ref_and_count (GObject * key, gint value, gpointer user_data) +_inc_ref_for_clones (gpointer key, gpointer value, gpointer user_data) { + SV *sv = key; + GObject *object = value; + +#ifdef NOISY + warn ("thread safety: reffing: 0x%p => 0x%p (%s)\n", + sv, object, G_OBJECT_TYPE_NAME (object)); +#endif + g_object_ref (object); + + PERL_UNUSED_VAR (sv); PERL_UNUSED_VAR (user_data); - g_object_ref (key); - g_hash_table_replace (perl_gobjects, key, (gpointer)++value); } #endif @@ -953,7 +967,7 @@ CLONE on all packages -- NOT on objects. that process. =cut -void +gboolean CLONE (gchar * class) CODE: /* !perl_gobjects can happen when no object has been created yet. */ @@ -961,14 +975,24 @@ CLONE (gchar * class) strcmp (class, "Glib::Object") == 0) { G_LOCK (perl_gobjects); -/*g_printerr ("we're in clone: %s\n", class);*/ - g_hash_table_foreach (perl_gobjects, - (GHFunc)_inc_ref_and_count, NULL); + g_hash_table_foreach (perl_gobjects, _inc_ref_for_clones, NULL); G_UNLOCK (perl_gobjects); } + RETVAL = TRUE; + OUTPUT: + RETVAL #endif +# =for apidoc __hide__ +# =cut +# gboolean +# CLONE_SKIP (class) +# CODE: +# RETVAL = TRUE; +# OUTPUT: +# RETVAL + =for apidoc set_threadsafe Enables/disables threadsafe gobject tracking. Returns whether or not tracking will be successful and thus whether using perl ithreads will be possible. @@ -1044,24 +1068,22 @@ DESTROY (SV *sv) #if GPERL_THREAD_SAFE if(perl_gobject_tracking) { - gint count; G_LOCK (perl_gobjects); - count = (int)g_hash_table_lookup (perl_gobjects, object); - count--; - if (count > 0) - { -/*g_printerr ("decing: %p - %d\n", object, count);*/ - g_hash_table_replace (perl_gobjects, object, - (gpointer)count); - } - else - { -/*g_printerr ("removing: %p\n", object);*/ - g_hash_table_remove (perl_gobjects, object); +#ifdef NOISY + warn ("thread safety: unreffing: 0x%p, 0x%p (%d) => 0x%p (%s, %d -> %d)\n", + sv, SvRV (sv), SvREFCNT (SvRV (sv)), + object, G_OBJECT_TYPE_NAME (object), + object->ref_count, object->ref_count - 1); +#endif + if (g_hash_table_remove (perl_gobjects, sv)) { +#ifdef NOISY + warn ("thread safety: removing: 0x%p, 0x%p => 0x%p (%s)\n", + sv, SvRV (sv), object, G_OBJECT_TYPE_NAME (object)); +#endif } G_UNLOCK (perl_gobjects); } -#endif +#endif /* GPERL_THREAD_SAFE */ g_object_unref (object); #ifdef NOISY warn ("DESTROY> (%p) done\n", object);