[perl-Glib-Object-Introspection] Make callbacks in callbacks more robust, and possibly more leaky
- From: Torsten SchÃnfeld <tsch src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [perl-Glib-Object-Introspection] Make callbacks in callbacks more robust, and possibly more leaky
- Date: Fri, 14 Oct 2011 17:37:40 +0000 (UTC)
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]