[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