summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSebastian Dröge <sebastian.droege@collabora.co.uk>2009-05-27 14:56:42 +0200
committerSebastian Dröge <sebastian.droege@collabora.co.uk>2009-05-27 15:00:19 +0200
commitede4562c23ac6405e1f9190aa8c3de0016d8c806 (patch)
tree9679b5e1cf0a4285092fc28b12013de3220e61a1
parentfebcfd772c169484d606e57e83815ea2179866fe (diff)
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.
-rw-r--r--gstreamer-sharp/Iterator.cs14
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);
}