mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-27 04:01:08 +00:00
bus: Use a construct-only property to distinguish between child buses and normal buses
This allows to only create the socketpair when it is really required instead of always creating it and immediately destroying it again for child buses. https://bugzilla.gnome.org/show_bug.cgi?id=647005
This commit is contained in:
parent
5c75330fea
commit
c41b0ade28
3 changed files with 57 additions and 23 deletions
|
@ -51,9 +51,6 @@ extern const char g_log_domain_gstreamer[];
|
|||
/* for the pad cache */
|
||||
#include "gstpad.h"
|
||||
|
||||
/* for GstBus */
|
||||
#include "gstbus.h"
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
/* used by gstparse.c and grammar.y */
|
||||
|
@ -139,11 +136,6 @@ gint priv_gst_date_time_compare (gconstpointer dt1, gconstpointer dt2);
|
|||
extern gboolean _gst_disable_registry_cache;
|
||||
#endif
|
||||
|
||||
/* Secret API used by GstBin to set the bus in child bus mode
|
||||
* without sockets and everything. See bug #646624.
|
||||
*/
|
||||
void _priv_gst_bus_set_child_mode (GstBus * bus);
|
||||
|
||||
/* provide inline gst_g_value_get_foo_unchecked(), used in gststructure.c */
|
||||
#define DEFINE_INLINE_G_VALUE_GET_UNCHECKED(ret_type,name_type,v_field) \
|
||||
static inline ret_type \
|
||||
|
|
|
@ -540,12 +540,11 @@ gst_bin_init (GstBin * bin, GstBinClass * klass)
|
|||
bin->clock_dirty = FALSE;
|
||||
|
||||
/* Set up a bus for listening to child elements */
|
||||
bus = gst_bus_new ();
|
||||
bus = g_object_new (GST_TYPE_BUS, "enable-async", FALSE, NULL);
|
||||
bin->child_bus = bus;
|
||||
GST_DEBUG_OBJECT (bin, "using bus %" GST_PTR_FORMAT " to listen to children",
|
||||
bus);
|
||||
gst_bus_set_sync_handler (bus, (GstBusSyncHandler) bin_bus_handler, bin);
|
||||
_priv_gst_bus_set_child_mode (bus);
|
||||
|
||||
bin->priv = GST_BIN_GET_PRIVATE (bin);
|
||||
bin->priv->asynchandling = DEFAULT_ASYNC_HANDLING;
|
||||
|
|
69
gst/gstbus.c
69
gst/gstbus.c
|
@ -89,6 +89,14 @@ enum
|
|||
LAST_SIGNAL
|
||||
};
|
||||
|
||||
#define DEFAULT_ENABLE_ASYNC (TRUE)
|
||||
|
||||
enum
|
||||
{
|
||||
PROP_0,
|
||||
PROP_ENABLE_ASYNC
|
||||
};
|
||||
|
||||
static void gst_bus_dispose (GObject * object);
|
||||
|
||||
static GstObjectClass *parent_class = NULL;
|
||||
|
@ -100,6 +108,7 @@ struct _GstBusPrivate
|
|||
GCond *queue_cond;
|
||||
GSource *watch_id;
|
||||
|
||||
gboolean enable_async;
|
||||
GstPoll *poll;
|
||||
GPollFD pollfd;
|
||||
};
|
||||
|
@ -134,6 +143,33 @@ marshal_VOID__MINIOBJECT (GClosure * closure, GValue * return_value,
|
|||
callback (data1, gst_value_get_mini_object (param_values + 1), data2);
|
||||
}
|
||||
|
||||
static void
|
||||
gst_bus_set_property (GObject * object,
|
||||
guint prop_id, const GValue * value, GParamSpec * pspec)
|
||||
{
|
||||
GstBus *bus = GST_BUS_CAST (object);
|
||||
|
||||
switch (prop_id) {
|
||||
case PROP_ENABLE_ASYNC:
|
||||
bus->priv->enable_async = g_value_get_boolean (value);
|
||||
break;
|
||||
default:
|
||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
gst_bus_constructed (GObject * object)
|
||||
{
|
||||
GstBus *bus = GST_BUS_CAST (object);
|
||||
|
||||
if (bus->priv->enable_async) {
|
||||
bus->priv->poll = gst_poll_new_timer ();
|
||||
gst_poll_get_read_gpollfd (bus->priv->poll, &bus->priv->pollfd);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
gst_bus_class_init (GstBusClass * klass)
|
||||
{
|
||||
|
@ -142,6 +178,25 @@ gst_bus_class_init (GstBusClass * klass)
|
|||
parent_class = g_type_class_peek_parent (klass);
|
||||
|
||||
gobject_class->dispose = gst_bus_dispose;
|
||||
gobject_class->set_property = gst_bus_set_property;
|
||||
gobject_class->constructed = gst_bus_constructed;
|
||||
|
||||
/* GstBus:enable-async:
|
||||
*
|
||||
* Enable async message delivery support for bus watches,
|
||||
* gst_bus_pop() and similar API. Without this only the
|
||||
* synchronous message handlers are called.
|
||||
*
|
||||
* This property is used to create the child element buses
|
||||
* in #GstBin.
|
||||
*
|
||||
* Since: 0.10.33
|
||||
*/
|
||||
g_object_class_install_property (gobject_class, PROP_ENABLE_ASYNC,
|
||||
g_param_spec_boolean ("enable-async", "Enable Async",
|
||||
"Enable async message delivery for bus watches and gst_bus_pop()",
|
||||
DEFAULT_ENABLE_ASYNC,
|
||||
G_PARAM_CONSTRUCT_ONLY | G_PARAM_WRITABLE | G_PARAM_STATIC_STRINGS));
|
||||
|
||||
/**
|
||||
* GstBus::sync-message:
|
||||
|
@ -191,8 +246,7 @@ gst_bus_init (GstBus * bus)
|
|||
bus->priv = G_TYPE_INSTANCE_GET_PRIVATE (bus, GST_TYPE_BUS, GstBusPrivate);
|
||||
bus->priv->queue_cond = g_cond_new ();
|
||||
|
||||
bus->priv->poll = gst_poll_new_timer ();
|
||||
gst_poll_get_read_gpollfd (bus->priv->poll, &bus->priv->pollfd);
|
||||
bus->priv->enable_async = DEFAULT_ENABLE_ASYNC;
|
||||
|
||||
GST_DEBUG_OBJECT (bus, "created");
|
||||
}
|
||||
|
@ -1285,14 +1339,3 @@ error:
|
|||
return;
|
||||
}
|
||||
}
|
||||
|
||||
/* Secret API used by GstBin to set the bus in child bus mode
|
||||
* without sockets and everything. See bug #646624.
|
||||
*/
|
||||
void
|
||||
_priv_gst_bus_set_child_mode (GstBus * bus)
|
||||
{
|
||||
if (bus->priv->poll)
|
||||
gst_poll_free (bus->priv->poll);
|
||||
bus->priv->poll = NULL;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue