[gst-cvs] gstreamer-sharp: Prevent that the GC frees the native GstIterator too early

Sebastian Dröge slomo at kemper.freedesktop.org
Wed May 27 06:00:47 PDT 2009


Module: gstreamer-sharp
Branch: master
Commit: ede4562c23ac6405e1f9190aa8c3de0016d8c806
URL:    http://cgit.freedesktop.org/gstreamer/gstreamer-sharp/commit/?id=ede4562c23ac6405e1f9190aa8c3de0016d8c806

Author: Sebastian Dröge <sebastian.droege at collabora.co.uk>
Date:   Wed May 27 14:56:42 2009 +0200

Prevent that the GC frees the native GstIterator too early

The native GstIterator is freed once the Gst.Enumerable instance
is destroyed. At this point there could still be a Gst.Enumerator
instance that uses the native GstIterator and would crash then.

Store the Gst.Enumerable instance inside the Gst.Enumerator to
prevent the GC from destroying it before the enumerator is destroyed.

---

 gstreamer-sharp/Iterator.cs |   14 ++++++++------
 1 files changed, 8 insertions(+), 6 deletions(-)

diff --git a/gstreamer-sharp/Iterator.cs b/gstreamer-sharp/Iterator.cs
index 5eb12bd..d9b690b 100644
--- a/gstreamer-sharp/Iterator.cs
+++ b/gstreamer-sharp/Iterator.cs
@@ -7,6 +7,7 @@ namespace Gst {
 
   internal class Enumerable : IEnumerable {
     private class Enumerator : IEnumerator {
+      Enumerable enumerable;
       Hashtable seen = new Hashtable ();
       IntPtr iterator;
 
@@ -57,7 +58,8 @@ namespace Gst {
           gst_iterator_resync (iterator);
       }
 
-      public Enumerator (IntPtr iterator) {
+      public Enumerator (Enumerable enumerable, IntPtr iterator) {
+        this.enumerable = enumerable;
         this.iterator = iterator;
       }
     }
@@ -67,11 +69,11 @@ namespace Gst {
 
     public Enumerable (IntPtr iterator) {
       this.iterator = iterator;
-      this.enumerator = new Enumerator (iterator);
+      this.enumerator = new Enumerator (this, iterator);
     }
 
     public IEnumerator GetEnumerator () {
-      return enumerator;
+      return this.enumerator;
     }
 
     ~Enumerable () {
@@ -79,11 +81,11 @@ namespace Gst {
         gst_iterator_free (iterator);
     }
 
-    [DllImport("libgstreamer-0.10.dll") ]
+    [DllImport ("libgstreamer-0.10.dll") ]
     static extern int gst_iterator_next (IntPtr iterator, out IntPtr elem);
-    [DllImport("libgstreamer-0.10.dll") ]
+    [DllImport ("libgstreamer-0.10.dll") ]
     static extern void gst_iterator_resync (IntPtr iterator);
-    [DllImport("libgstreamer-0.10.dll") ]
+    [DllImport ("libgstreamer-0.10.dll") ]
     static extern void gst_iterator_free (IntPtr iterator);
 
   }





More information about the Gstreamer-commits mailing list