Free CString memory in Rust

Using g_free() on it will likely not work.
This commit is contained in:
Sebastian Dröge 2016-05-19 10:47:31 +03:00
parent acc7d2ea26
commit 872e9a8ab1
3 changed files with 25 additions and 4 deletions

View file

@ -42,6 +42,8 @@ extern gboolean sink_start (void * filesink);
extern gboolean sink_stop (void * filesink);
extern void sink_drop (void * filesink);
extern void cstring_drop (void * str);
GST_DEBUG_CATEGORY_STATIC (gst_rs_sink_debug);
#define GST_CAT_DEFAULT gst_rs_sink_debug
@ -151,9 +153,13 @@ gst_rs_sink_get_property (GObject * object, guint prop_id, GValue * value,
GstRsSink *sink = GST_RS_SINK (object);
switch (prop_id) {
case PROP_URI:
g_value_take_string (value, sink_get_uri (sink->instance));
case PROP_URI: {
gchar *str = sink_get_uri (sink->instance);
g_value_set_string (value, str);
if (str)
cstring_drop (str);
break;
}
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;

View file

@ -43,6 +43,8 @@ extern gboolean source_is_seekable (void * source);
extern gboolean source_start (void * source);
extern gboolean source_stop (void * source);
extern void cstring_drop (void * str);
GST_DEBUG_CATEGORY_STATIC (gst_rs_src_debug);
#define GST_CAT_DEFAULT gst_rs_src_debug
@ -161,9 +163,13 @@ gst_rs_src_get_property (GObject * object, guint prop_id, GValue * value,
GstRsSrc *src = GST_RS_SRC (object);
switch (prop_id) {
case PROP_URI:
g_value_take_string (value, source_get_uri (src->instance));
case PROP_URI: {
gchar *str = source_get_uri (src->instance);
g_value_set_string (value, str);
if (str)
cstring_drop (str);
break;
}
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;

View file

@ -14,6 +14,10 @@
// License along with this library; if not, write to the
// Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
// Boston, MA 02110-1301, USA.
//
//
use libc::c_char;
use std::ffi::CString;
#[macro_export]
macro_rules! println_err(
@ -52,3 +56,8 @@ impl GBoolean {
}
}
#[no_mangle]
pub extern "C" fn cstring_drop(ptr: *mut c_char) {
unsafe { CString::from_raw(ptr); }
}