[perl-Glib-Object-Introspection] Make callbacks in callbacks more robust, and possibly more leaky



commit cfbbb99eb50e0510ad3687a01c64d414dd839bc5
Author: Torsten SchÃnfeld <kaffeetisch gmx de>
Date:   Fri Oct 14 19:08:08 2011 +0200

    Make callbacks in callbacks more robust, and possibly more leaky
    
    At the moment, I don't see a safe way to free all resources.  Also, this stuff
    is really mind-bending.

 GObjectIntrospection.xs       |    2 --
 gperl-i11n-callback.c         |    2 ++
 gperl-i11n-invoke-perl.c      |    5 ++---
 gperl-i11n-marshal-callback.c |   32 ++------------------------------
 4 files changed, 6 insertions(+), 35 deletions(-)
---
diff --git a/GObjectIntrospection.xs b/GObjectIntrospection.xs
index e085ccc..03b83ea 100644
--- a/GObjectIntrospection.xs
+++ b/GObjectIntrospection.xs
@@ -60,8 +60,6 @@ typedef struct {
 	guint destroy_pos;
 
 	SV *data_sv;
-
-	gboolean free_after_use;
 } GPerlI11nCCallbackInfo;
 
 typedef struct {
diff --git a/gperl-i11n-callback.c b/gperl-i11n-callback.c
index 50ab579..99b4172 100644
--- a/gperl-i11n-callback.c
+++ b/gperl-i11n-callback.c
@@ -82,6 +82,8 @@ release_perl_callback (gpointer data)
 	g_free (info);
 }
 
+/* -------------------------------------------------------------------------- */
+
 static GPerlI11nCCallbackInfo *
 create_c_callback_closure (GIBaseInfo *interface, gpointer func)
 {
diff --git a/gperl-i11n-invoke-perl.c b/gperl-i11n-invoke-perl.c
index f718fa8..f44bd9c 100644
--- a/gperl-i11n-invoke-perl.c
+++ b/gperl-i11n-invoke-perl.c
@@ -126,9 +126,8 @@ invoke_callback (ffi_cif* cif, gpointer resp, gpointer* args, gpointer userdata)
 		        n_returned, n_return_values);
 	}
 
-	/* free call-scoped callback infos */
-	g_slist_foreach (iinfo.free_after_call,
-	                 (GFunc) release_c_callback, NULL);
+	/* call-scoped callback infos are freed by
+	 * Glib::Object::Introspection::_FuncWrapper::DESTROY */
 
 	SPAGAIN;
 
diff --git a/gperl-i11n-marshal-callback.c b/gperl-i11n-marshal-callback.c
index 43ce193..e710c01 100644
--- a/gperl-i11n-marshal-callback.c
+++ b/gperl-i11n-marshal-callback.c
@@ -87,7 +87,6 @@ callback_to_sv (GICallableInfo *interface, gpointer func, GPerlI11nInvocationInf
 	GPerlI11nCCallbackInfo *callback_info;
 	HV *stash;
 	SV *code_sv, *data_sv;
-	GIScopeType scope;
 
 	GSList *l;
 	for (l = invocation_info->callback_infos; l != NULL; l = l->next) {
@@ -112,7 +111,7 @@ callback_to_sv (GICallableInfo *interface, gpointer func, GPerlI11nInvocationInf
 	callback_info = create_c_callback_closure (interface, func);
 	callback_info->data_pos = g_arg_info_get_closure (arg_info);
 	callback_info->destroy_pos = g_arg_info_get_destroy (arg_info);
-	callback_info->free_after_use = FALSE;
+	g_base_info_unref (arg_info);
 
 	if (func) {
 		data_sv = newSViv (PTR2IV (callback_info));
@@ -126,31 +125,6 @@ callback_to_sv (GICallableInfo *interface, gpointer func, GPerlI11nInvocationInf
 	dwarn ("      C callback data at %d, destroy at %d\n",
 	       callback_info->data_pos, callback_info->destroy_pos);
 
-	scope = func
-		? g_arg_info_get_scope (arg_info)
-		: GI_SCOPE_TYPE_CALL;
-	switch (scope) {
-	    case GI_SCOPE_TYPE_CALL:
-		dwarn ("      C callback has scope 'call'\n");
-		invocation_info->free_after_call
-			= g_slist_prepend (invocation_info->free_after_call,
-			                   callback_info);
-		break;
-	    case GI_SCOPE_TYPE_NOTIFIED:
-		dwarn ("      C callback has scope 'notified'\n");
-		/* This case is already taken care of by the notify
-		 * stuff above */
-		break;
-	    case GI_SCOPE_TYPE_ASYNC:
-		dwarn ("      C callback has scope 'async'\n");
-		/* FIXME: callback_info->free_after_use = TRUE; */
-		break;
-	    default:
-		ccroak ("unhandled scope type %d encountered",
-		       g_arg_info_get_scope (arg_info));
-	}
-
-	g_base_info_unref (arg_info);
 
 	invocation_info->callback_infos =
 		g_slist_prepend (invocation_info->callback_infos,
@@ -166,8 +140,6 @@ callback_data_to_sv (gpointer data,
                      GPerlI11nInvocationInfo * invocation_info)
 {
 	GSList *l;
-	if (!data)
-		return NULL;
 	if (!invocation_info)
 		return NULL;
 	for (l = invocation_info->callback_infos; l != NULL; l = l->next) {
@@ -179,7 +151,7 @@ callback_data_to_sv (gpointer data,
 			return callback_info->data_sv;
 		}
 	}
-	if (invocation_info->is_callback) {
+	if (data && invocation_info->is_callback) {
 		GPerlI11nPerlCallbackInfo *wrapper = data;
 		dwarn ("      user data for Perl callback %p\n", wrapper);
 		return wrapper->data;



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]