cairo: Clean up Region's Dispose/ctor

This commit is contained in:
Michael Hutchinson 2013-03-06 00:35:46 -05:00 committed by Bertrand Lorentz
parent 50ee23f0f2
commit bdc2cfdf1d

View File

@ -47,11 +47,7 @@ namespace Cairo
get { return handle; } get { return handle; }
} }
~Region () [Obsolete]
{
Console.WriteLine ("Cairo.Region finalizer reached - developer must dispose regions manually to avoid leakage due to thread-safety concerns.");
}
public Region (IntPtr handle) : this (handle, false) {} public Region (IntPtr handle) : this (handle, false) {}
public Region (IntPtr handle, bool owned) public Region (IntPtr handle, bool owned)
@ -59,11 +55,12 @@ namespace Cairo
this.handle = handle; this.handle = handle;
if (!owned) if (!owned)
NativeMethods.cairo_region_reference (handle); NativeMethods.cairo_region_reference (handle);
if (CairoDebug.Enabled)
CairoDebug.OnAllocated (handle);
} }
public Region () public Region () : this (NativeMethods.cairo_region_create () , true)
{ {
handle = NativeMethods.cairo_region_create ();
} }
public Region (RectangleInt rect) public Region (RectangleInt rect)
@ -81,14 +78,29 @@ namespace Cairo
return new Region (NativeMethods.cairo_region_copy (Handle), true); return new Region (NativeMethods.cairo_region_copy (Handle), true);
} }
~Region ()
{
Dispose (false);
}
public void Dispose () public void Dispose ()
{ {
if (handle != IntPtr.Zero) Dispose (true);
NativeMethods.cairo_region_destroy (Handle);
handle = IntPtr.Zero;
GC.SuppressFinalize (this); GC.SuppressFinalize (this);
} }
protected virtual void Dispose (bool disposing)
{
if (!disposing || CairoDebug.Enabled)
CairoDebug.OnDisposed<Region> (handle, disposing);
if (!disposing|| handle == IntPtr.Zero)
return;
NativeMethods.cairo_region_destroy (Handle);
handle = IntPtr.Zero;
}
public override bool Equals (object obj) public override bool Equals (object obj)
{ {
return (obj is Region) && NativeMethods.cairo_region_equal (Handle, (obj as Region).Handle); return (obj is Region) && NativeMethods.cairo_region_equal (Handle, (obj as Region).Handle);