source: don't leak sockets

This commit is contained in:
Wim Taymans 2015-12-02 20:40:25 +01:00
parent 48fdc1d37c
commit 6b93b17298
2 changed files with 7 additions and 4 deletions

View file

@ -138,6 +138,7 @@ setup_pipeline (PinosGstSource *source, GError **error)
"sync", TRUE, "sync", TRUE,
"enable-last-sample", FALSE, "enable-last-sample", FALSE,
NULL); NULL);
gst_bin_add (GST_BIN (priv->pipeline), priv->sink); gst_bin_add (GST_BIN (priv->pipeline), priv->sink);
gst_element_link (elem, priv->sink); gst_element_link (elem, priv->sink);
@ -303,15 +304,16 @@ on_socket_notify (GObject *gobject,
g_object_get (gobject, "socket", &socket, NULL); g_object_get (gobject, "socket", &socket, NULL);
if (socket == NULL) { if (socket == NULL) {
GSocket *prev_socket = g_object_get_data (gobject, "last-socket"); GSocket *prev_socket = g_object_steal_data (gobject, "last-socket");
if (prev_socket) { if (prev_socket) {
g_signal_emit_by_name (priv->sink, "remove", prev_socket); g_signal_emit_by_name (priv->sink, "remove", prev_socket);
g_object_unref (prev_socket);
} }
} else { } else {
pinos_source_report_busy (PINOS_SOURCE (source)); pinos_source_report_busy (PINOS_SOURCE (source));
g_signal_emit_by_name (priv->sink, "add", socket); g_signal_emit_by_name (priv->sink, "add", socket);
g_object_set_data_full (gobject, "last-socket", socket, g_object_unref);
} }
g_object_set_data (gobject, "last-socket", socket);
g_object_get (priv->sink, "num-handles", &num_handles, NULL); g_object_get (priv->sink, "num-handles", &num_handles, NULL);
if (num_handles == 0) { if (num_handles == 0) {

View file

@ -252,14 +252,15 @@ on_socket_notify (GObject *gobject,
g_object_get (gobject, "socket", &socket, NULL); g_object_get (gobject, "socket", &socket, NULL);
if (socket == NULL) { if (socket == NULL) {
GSocket *prev_socket = g_object_get_data (gobject, "last-socket"); GSocket *prev_socket = g_object_steal_data (gobject, "last-socket");
if (prev_socket) { if (prev_socket) {
g_signal_emit_by_name (priv->sink, "remove", prev_socket); g_signal_emit_by_name (priv->sink, "remove", prev_socket);
g_object_unref (prev_socket);
} }
} else { } else {
g_signal_emit_by_name (priv->sink, "add", socket); g_signal_emit_by_name (priv->sink, "add", socket);
g_object_set_data_full (gobject, "last-socket", socket, g_object_unref);
} }
g_object_set_data (gobject, "last-socket", socket);
g_object_get (priv->sink, "num-handles", &num_handles, NULL); g_object_get (priv->sink, "num-handles", &num_handles, NULL);
if (num_handles > 0 && socket) { if (num_handles > 0 && socket) {