From 4f42fb77fbaf49a543d35e929c24abd485b5daf0 Mon Sep 17 00:00:00 2001 From: Mike Kestner Date: Fri, 29 Jul 2011 13:33:02 -0500 Subject: [PATCH] Improve ToggleRef release overhead. Candidate patch provided by Andres in pull request #17. * glib/Object.cs: use ToggleRef.Dispose. * glib/ToggleRef.cs: implement IDisposable and expose former Free functionality as Dispose(). Free is now private non-lock taking called by Dispose and the idle queue handler. --- glib/Object.cs | 4 ++-- glib/ToggleRef.cs | 10 +++++++--- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/glib/Object.cs b/glib/Object.cs index a5488c98b..1b84e89fc 100644 --- a/glib/Object.cs +++ b/glib/Object.cs @@ -69,7 +69,7 @@ namespace GLib { return; if (disposing) - tref.Free (); + tref.Dispose (); else tref.QueueUnref (); } @@ -429,7 +429,7 @@ namespace GLib { if (handle != IntPtr.Zero) { Objects.Remove (handle); if (tref != null) { - tref.Free (); + tref.Dispose (); tref = null; } } diff --git a/glib/ToggleRef.cs b/glib/ToggleRef.cs index bd2b996ce..d133a0218 100644 --- a/glib/ToggleRef.cs +++ b/glib/ToggleRef.cs @@ -25,7 +25,7 @@ using System.Runtime.InteropServices; namespace GLib { - internal class ToggleRef { + internal class ToggleRef : IDisposable { bool hardened; IntPtr handle; @@ -57,12 +57,16 @@ namespace GLib { } } - public void Free () - { + public void Dispose () + { lock (PendingDestroys) { PendingDestroys.Remove (this); } + Free (); + } + void Free () + { if (hardened) g_object_unref (handle); else