From d7f231117de437aec14cc3a4bfd5d726691a8790 Mon Sep 17 00:00:00 2001 From: Mike Kestner Date: Tue, 27 Jan 2009 17:45:15 +0000 Subject: [PATCH] 2009-01-27 Mike Kestner * glib/Opaque.cs: ensure we are running on the gui thread when we dispose from the finalizer. [Fixes #419777] svn path=/trunk/gtk-sharp/; revision=124683 --- ChangeLog | 5 +++++ glib/Opaque.cs | 25 ++++++++++++++++++++++++- 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/ChangeLog b/ChangeLog index b99aa9c5a..b038fde6c 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2009-01-27 Mike Kestner + + * glib/Opaque.cs: ensure we are running on the gui thread when we + dispose from the finalizer. [Fixes #419777] + 2009-01-26 Mike Kestner * glib/Value.cs: make the pad fields a blink explicitly sized struct diff --git a/glib/Opaque.cs b/glib/Opaque.cs index b4e463dc2..9b4e4bba8 100644 --- a/glib/Opaque.cs +++ b/glib/Opaque.cs @@ -88,9 +88,32 @@ namespace GLib { } } + class FinalizeInfo { + Type type; + IntPtr native; + bool owned; + + public FinalizeInfo (Type type, IntPtr native, bool owned) + { + this.type = type; + this.native = native; + this.owned = owned; + } + + public bool Handler () + { + Opaque inst = GetOpaque (native, type, owned); + inst.Dispose (); + return false; + } + } + ~Opaque () { - Dispose (); + if (_obj == IntPtr.Zero) + return; + FinalizeInfo info = new FinalizeInfo (GetType(), _obj, owned); + Timeout.Add (50, new TimeoutHandler (info.Handler)); } public virtual void Dispose ()