From caae027f2f3894704b158cb92d8e6e5a830e8749 Mon Sep 17 00:00:00 2001 From: Miguel de Icaza Date: Sat, 7 Jul 2007 20:01:40 +0000 Subject: Implement properly the dispose patternw where possible svn path=/trunk/mcs/; revision=81575 --- mcs/class/Mono.Cairo/Mono.Cairo/FontFace.cs | 9 ++++++++- mcs/class/Mono.Cairo/Mono.Cairo/Pattern.cs | 22 ++++++++++++++++------ 2 files changed, 24 insertions(+), 7 deletions(-) (limited to 'mcs/class/Mono.Cairo') diff --git a/mcs/class/Mono.Cairo/Mono.Cairo/FontFace.cs b/mcs/class/Mono.Cairo/Mono.Cairo/FontFace.cs index 684bf0f80e7..a7adbd9339a 100644 --- a/mcs/class/Mono.Cairo/Mono.Cairo/FontFace.cs +++ b/mcs/class/Mono.Cairo/Mono.Cairo/FontFace.cs @@ -54,11 +54,18 @@ namespace Cairo // font_face here, the programmer must do this with IDisposable.Dispose Console.Error.WriteLine ("Programmer forgot to call Dispose on the FontFace"); + Dispose (false); } void IDisposable.Dispose () { - NativeMethods.cairo_font_face_destroy (handle); + Dispose (true); + } + + protected virtual void Dispose (bool disposing) + { + if (disposing) + NativeMethods.cairo_font_face_destroy (handle); handle = IntPtr.Zero; GC.SuppressFinalize (this); } diff --git a/mcs/class/Mono.Cairo/Mono.Cairo/Pattern.cs b/mcs/class/Mono.Cairo/Mono.Cairo/Pattern.cs index a4ee9daa533..80a180ee332 100644 --- a/mcs/class/Mono.Cairo/Mono.Cairo/Pattern.cs +++ b/mcs/class/Mono.Cairo/Mono.Cairo/Pattern.cs @@ -76,9 +76,6 @@ namespace Cairo { ~Pattern () { - lock (patterns){ - patterns.Remove (this); - } } [Obsolete ("Use the SurfacePattern constructor")] @@ -92,14 +89,27 @@ namespace Cairo { NativeMethods.cairo_pattern_reference (pattern); } - public void Dispose () + void IDisposable.Dispose () + { + Dispose (true); + } + + protected virtual void Dispose (bool disposing) { - Destroy (); + if (disposing) + Destroy (); + GC.SuppressFinalize (this); } public void Destroy () { - NativeMethods.cairo_pattern_destroy (pattern); + if (pattern != IntPtr.Zero){ + NativeMethods.cairo_pattern_destroy (pattern); + pattern = IntPtr.Zero; + } + lock (patterns){ + patterns.Remove (this); + } } public Status Status -- cgit v1.2.3