Author: mkestner
Date: 2008-01-22 11:57:33 -0500 (Tue, 22 Jan 2008)
New Revision: 93549
Modified:
branches/gtk-sharp-2-10-branch/ChangeLog
branches/gtk-sharp-2-10-branch/glib/Object.cs
branches/gtk-sharp-2-10-branch/glib/Signal.cs
branches/gtk-sharp-2-10-branch/glib/ToggleRef.cs
Log:
2008-01-22 Mike Kestner <[EMAIL PROTECTED]>
* glib/Object.cs: expose an internal ToggleRef prop.
* glib/Signal.cs: use ToggleRef for lookups instead of Object. Add
a Free method and release connections and gchandles.
* glib/ToggleRef.cs: add signal hash and release signals on free.
Modified: branches/gtk-sharp-2-10-branch/ChangeLog
===================================================================
--- branches/gtk-sharp-2-10-branch/ChangeLog 2008-01-22 16:54:44 UTC (rev
93548)
+++ branches/gtk-sharp-2-10-branch/ChangeLog 2008-01-22 16:57:33 UTC (rev
93549)
@@ -1,3 +1,10 @@
+2008-01-22 Mike Kestner <[EMAIL PROTECTED]>
+
+ * glib/Object.cs: expose an internal ToggleRef prop.
+ * glib/Signal.cs: use ToggleRef for lookups instead of Object. Add
+ a Free method and release connections and gchandles.
+ * glib/ToggleRef.cs: add signal hash and release signals on free.
+
2008-01-17 Mike Kestner <[EMAIL PROTECTED]>
* parser/gapi2xml.pl: fix tightloop in single-line prop declarations.
Modified: branches/gtk-sharp-2-10-branch/glib/Object.cs
===================================================================
--- branches/gtk-sharp-2-10-branch/glib/Object.cs 2008-01-22 16:54:44 UTC
(rev 93548)
+++ branches/gtk-sharp-2-10-branch/glib/Object.cs 2008-01-22 16:57:33 UTC
(rev 93549)
@@ -32,6 +32,7 @@
public class Object : IWrapper, IDisposable {
IntPtr handle;
+ ToggleRef tref;
bool disposed = false;
Hashtable data;
static Hashtable Objects = new Hashtable();
@@ -276,14 +277,17 @@
return;
if (handle != IntPtr.Zero) {
- ToggleRef tref = Objects [handle] as
ToggleRef;
Objects.Remove (handle);
- if (tref != null)
+ if (tref != null) {
tref.Free ();
+ tref = null;
+ }
}
handle = value;
- if (value != IntPtr.Zero)
- Objects [value] = new ToggleRef (this);
+ if (value != IntPtr.Zero) {
+ tref = new ToggleRef (this);
+ Objects [value] = tref;
+ }
}
}
@@ -308,23 +312,19 @@
}
}
- public IntPtr Handle {
+ internal ToggleRef ToggleRef {
get {
- return handle;
+ return tref;
}
}
- Hashtable signals;
- internal Hashtable Signals {
+ public IntPtr Handle {
get {
- if (signals == null)
- signals = new Hashtable ();
- return signals;
+ return handle;
}
}
Hashtable before_signals;
-
[Obsolete ("Replaced by GLib.Signal marshaling mechanism.")]
protected Hashtable BeforeSignals {
get {
Modified: branches/gtk-sharp-2-10-branch/glib/Signal.cs
===================================================================
--- branches/gtk-sharp-2-10-branch/glib/Signal.cs 2008-01-22 16:54:44 UTC
(rev 93548)
+++ branches/gtk-sharp-2-10-branch/glib/Signal.cs 2008-01-22 16:57:33 UTC
(rev 93549)
@@ -22,6 +22,7 @@
namespace GLib {
using System;
+ using System.Collections;
using System.Runtime.InteropServices;
[Flags]
@@ -51,21 +52,35 @@
public class Signal {
GCHandle gc_handle;
- Object obj;
+ ToggleRef tref;
string name;
uint before_id = UInt32.MaxValue;
uint after_id = UInt32.MaxValue;
Delegate marshaler;
+ ~Signal ()
+ {
+ gc_handle.Free ();
+ }
+
private Signal (GLib.Object obj, string signal_name, Delegate
marshaler)
{
- this.obj = obj;
+ tref = obj.ToggleRef;
name = signal_name;
this.marshaler = marshaler;
gc_handle = GCHandle.Alloc (this, GCHandleType.Weak);
- obj.Signals [name] = this;
+ tref.Signals [name] = this;
}
+ internal void Free ()
+ {
+ DisconnectHandler (before_id);
+ DisconnectHandler (after_id);
+ before_handler = after_handler = marshaler = null;
+ gc_handle.Free ();
+ GC.SuppressFinalize (this);
+ }
+
public static Signal Lookup (GLib.Object obj, string name)
{
return Lookup (obj, name, EventHandlerDelegate);
@@ -73,7 +88,7 @@
public static Signal Lookup (GLib.Object obj, string name,
Delegate marshaler)
{
- Signal result = obj.Signals [name] as Signal;
+ Signal result = obj.ToggleRef.Signals [name] as Signal;
if (result == null)
result = new Signal (obj, name, marshaler);
return result as Signal;
@@ -84,7 +99,7 @@
public Delegate Handler {
get {
- InvocationHint hint = (InvocationHint)
Marshal.PtrToStructure (g_signal_get_invocation_hint (obj.Handle), typeof
(InvocationHint));
+ InvocationHint hint = (InvocationHint)
Marshal.PtrToStructure (g_signal_get_invocation_hint (tref.Handle), typeof
(InvocationHint));
if (hint.run_type == SignalFlags.RunFirst)
return before_handler;
else
@@ -95,7 +110,7 @@
uint Connect (int flags)
{
IntPtr native_name = GLib.Marshaller.StringToPtrGStrdup
(name);
- uint id = g_signal_connect_data (obj.Handle,
native_name, marshaler, (IntPtr) gc_handle, IntPtr.Zero, flags);
+ uint id = g_signal_connect_data (tref.Handle,
native_name, marshaler, (IntPtr) gc_handle, IntPtr.Zero, flags);
GLib.Marshaller.Free (native_name);
return id;
}
@@ -134,13 +149,13 @@
}
if (after_id == UInt32.MaxValue && before_id ==
UInt32.MaxValue)
- obj.Signals.Remove (name);
+ tref.Signals.Remove (name);
}
void DisconnectHandler (uint handler_id)
{
- if (handler_id != UInt32.MaxValue &&
g_signal_handler_is_connected (obj.Handle, handler_id))
- g_signal_handler_disconnect (obj.Handle,
handler_id);
+ if (handler_id != UInt32.MaxValue &&
g_signal_handler_is_connected (tref.Handle, handler_id))
+ g_signal_handler_disconnect (tref.Handle,
handler_id);
}
[CDeclCallback]
Modified: branches/gtk-sharp-2-10-branch/glib/ToggleRef.cs
===================================================================
--- branches/gtk-sharp-2-10-branch/glib/ToggleRef.cs 2008-01-22 16:54:44 UTC
(rev 93548)
+++ branches/gtk-sharp-2-10-branch/glib/ToggleRef.cs 2008-01-22 16:57:33 UTC
(rev 93549)
@@ -22,6 +22,7 @@
namespace GLib {
using System;
+ using System.Collections;
using System.Runtime.InteropServices;
internal class ToggleRef {
@@ -29,6 +30,7 @@
IntPtr handle;
object reference;
GCHandle gch;
+ Hashtable signals;
public ToggleRef (GLib.Object target)
{
@@ -50,6 +52,20 @@
}
}
+ public IntPtr Handle {
+ get {
+ return handle;
+ }
+ }
+
+ public Hashtable Signals {
+ get {
+ if (signals == null)
+ signals = new Hashtable ();
+ return signals;
+ }
+ }
+
public GLib.Object Target {
get {
if (reference is GLib.Object)
@@ -62,6 +78,9 @@
public void Free ()
{
+ foreach (Signal s in Signals.Values)
+ s.Free ();
+ Signals.Clear ();
g_object_remove_toggle_ref (handle,
ToggleNotifyCallback, (IntPtr) gch);
reference = null;
gch.Free ();
_______________________________________________
Mono-patches maillist - [email protected]
http://lists.ximian.com/mailman/listinfo/mono-patches