mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer-rs.git
synced 2025-02-17 03:25:36 +00:00
Let the glib::Value destructor clean up our values instead of doing so manually
This commit is contained in:
parent
ad7b21ba55
commit
1f80df493a
1 changed files with 11 additions and 9 deletions
|
@ -53,20 +53,23 @@ where
|
||||||
let it = self.to_glib_none().0;
|
let it = self.to_glib_none().0;
|
||||||
mem::forget(self);
|
mem::forget(self);
|
||||||
|
|
||||||
let mut closure_value: gobject_ffi::GValue = mem::zeroed();
|
|
||||||
let func_box: Box<Fn(T) -> bool + Send + Sync + 'static> = Box::new(func);
|
let func_box: Box<Fn(T) -> bool + Send + Sync + 'static> = Box::new(func);
|
||||||
gobject_ffi::g_value_init(&mut closure_value, filter_boxed_get_type::<T>());
|
// FIXME: Use Value::from_type once we depend on new enough GLib
|
||||||
gobject_ffi::g_value_take_boxed(
|
let mut closure_value = glib::Value::uninitialized();
|
||||||
&mut closure_value,
|
gobject_ffi::g_value_init(
|
||||||
|
closure_value.to_glib_none_mut().0,
|
||||||
|
filter_boxed_get_type::<T>(),
|
||||||
|
);
|
||||||
|
gobject_ffi::g_value_set_boxed(
|
||||||
|
closure_value.to_glib_none_mut().0,
|
||||||
Arc::into_raw(Arc::new(func_box)) as gpointer,
|
Arc::into_raw(Arc::new(func_box)) as gpointer,
|
||||||
);
|
);
|
||||||
|
|
||||||
let it = from_glib_full(ffi::gst_iterator_filter(
|
let it = from_glib_full(ffi::gst_iterator_filter(
|
||||||
it as *mut _,
|
it as *mut _,
|
||||||
Some(filter_trampoline::<T>),
|
Some(filter_trampoline::<T>),
|
||||||
&closure_value,
|
closure_value.to_glib_none().0,
|
||||||
));
|
));
|
||||||
gobject_ffi::g_value_unset(&mut closure_value);
|
|
||||||
|
|
||||||
it
|
it
|
||||||
}
|
}
|
||||||
|
@ -129,8 +132,9 @@ where
|
||||||
let func_obj: &mut (FnMut(U, T) -> Result<U, U>) = &mut func;
|
let func_obj: &mut (FnMut(U, T) -> Result<U, U>) = &mut func;
|
||||||
let func_ptr = &func_obj as *const &mut (FnMut(U, T) -> Result<U, U>) as gpointer;
|
let func_ptr = &func_obj as *const &mut (FnMut(U, T) -> Result<U, U>) as gpointer;
|
||||||
|
|
||||||
let mut ret = glib::Value::uninitialized();
|
|
||||||
let mut accum = Some(init);
|
let mut accum = Some(init);
|
||||||
|
// FIXME: Use Value::from_type once we depend on new enough GLib
|
||||||
|
let mut ret = glib::Value::uninitialized();
|
||||||
gobject_ffi::g_value_init(ret.to_glib_none_mut().0, gobject_ffi::G_TYPE_POINTER);
|
gobject_ffi::g_value_init(ret.to_glib_none_mut().0, gobject_ffi::G_TYPE_POINTER);
|
||||||
gobject_ffi::g_value_set_pointer(
|
gobject_ffi::g_value_set_pointer(
|
||||||
ret.to_glib_none_mut().0,
|
ret.to_glib_none_mut().0,
|
||||||
|
@ -144,8 +148,6 @@ where
|
||||||
func_ptr,
|
func_ptr,
|
||||||
);
|
);
|
||||||
|
|
||||||
gobject_ffi::g_value_unset(ret.to_glib_none_mut().0);
|
|
||||||
|
|
||||||
match res {
|
match res {
|
||||||
ffi::GST_ITERATOR_OK | ffi::GST_ITERATOR_DONE => Ok(accum.unwrap()),
|
ffi::GST_ITERATOR_OK | ffi::GST_ITERATOR_DONE => Ok(accum.unwrap()),
|
||||||
ffi::GST_ITERATOR_RESYNC => Err(IteratorError::Resync),
|
ffi::GST_ITERATOR_RESYNC => Err(IteratorError::Resync),
|
||||||
|
|
Loading…
Reference in a new issue