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

Reply via email to