[vala] D-Bus: Fix memory leaks in servers
- From: Jürg Billeter <juergbi src gnome org>
- To: svn-commits-list gnome org
- Subject: [vala] D-Bus: Fix memory leaks in servers
- Date: Sun, 31 May 2009 16:17:09 -0400 (EDT)
commit d2e7678f699f0c2f13f31104d201406353688a75
Author: Jürg Billeter <j bitron ch>
Date: Sun May 31 22:14:32 2009 +0200
D-Bus: Fix memory leaks in servers
Free allocated memory used for parameters and return values in D-Bus
servers. Based on patch by Sebastian Pölsterl, fixes bug 566207.
---
codegen/valadbusservermodule.vala | 17 ++++++++++++++++-
1 files changed, 16 insertions(+), 1 deletions(-)
diff --git a/codegen/valadbusservermodule.vala b/codegen/valadbusservermodule.vala
index e02b7ed..1ffcbda 100644
--- a/codegen/valadbusservermodule.vala
+++ b/codegen/valadbusservermodule.vala
@@ -111,7 +111,10 @@ internal class Vala.DBusServerModule : DBusClientModule {
string type_signature = "";
foreach (FormalParameter param in m.get_parameters ()) {
- cdecl = new CCodeDeclaration (param.parameter_type.get_cname ());
+ var owned_type = param.parameter_type.copy ();
+ owned_type.value_owned = true;
+
+ cdecl = new CCodeDeclaration (owned_type.get_cname ());
cdecl.add_declarator (new CCodeVariableDeclarator (param.name, default_value_for_type (param.parameter_type, true)));
prefragment.append (cdecl);
if (type_signature == ""
@@ -165,6 +168,12 @@ internal class Vala.DBusServerModule : DBusClientModule {
} else {
write_expression (postfragment, param.parameter_type, new CCodeIdentifier ("iter"), new CCodeIdentifier (param.name));
}
+
+ if (requires_destroy (owned_type)) {
+ var ma = new MemberAccess.simple (param.name);
+ ma.symbol_reference = param;
+ postfragment.append (new CCodeExpressionStatement (get_unref_expression (new CCodeIdentifier (param.name), owned_type, ma)));
+ }
}
signature_check.add_argument (new CCodeConstant ("\"%s\"".printf (type_signature)));
@@ -192,6 +201,12 @@ internal class Vala.DBusServerModule : DBusClientModule {
}
write_expression (postfragment, m.return_type, new CCodeIdentifier ("iter"), new CCodeIdentifier ("result"));
+
+ if (requires_destroy (m.return_type)) {
+ var ma = new MemberAccess.simple ("result");
+ ma.symbol_reference = new LocalVariable (m.return_type, "result");
+ postfragment.append (new CCodeExpressionStatement (get_unref_expression (new CCodeIdentifier ("result"), m.return_type, ma)));
+ }
}
} else {
block.add_statement (new CCodeExpressionStatement (ccall));
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]