From e8d0b019b33284eba03e737154f6c526bc7e6b66 Mon Sep 17 00:00:00 2001 From: Marcin Kolny Date: Thu, 4 Jun 2015 01:50:34 +0200 Subject: [PATCH] tracer: add missing hooks Add following hooks: element-new, element-add-pad, element-remove-pad, bin-add-pre, bin-add-post, bin-remove-pre, bin-remove-post, pad-link-pre, pad-link-post, pad-unlink-pre, pad-unlink-post. https://bugzilla.gnome.org/show_bug.cgi?id=733187 --- docs/design/draft-tracing.txt | 13 ++--- gst/gstbin.c | 4 ++ gst/gstelement.c | 4 +- gst/gstelementfactory.c | 3 ++ gst/gstpad.c | 11 +++- gst/gsttracerutils.c | 5 +- gst/gsttracerutils.h | 99 +++++++++++++++++++++++++++++++++++ 7 files changed, 129 insertions(+), 10 deletions(-) diff --git a/docs/design/draft-tracing.txt b/docs/design/draft-tracing.txt index 2011dcfc32..3a6f692e58 100644 --- a/docs/design/draft-tracing.txt +++ b/docs/design/draft-tracing.txt @@ -88,18 +88,19 @@ we can create them ad-hoc and avoid the GST_TRACE_TIMERS var. Hooks (* already implemented) ----- -- gst_bin_add -- gst_bin_remove -- gst_element_add_pad +* gst_bin_add +* gst_bin_remove +* gst_element_add_pad * gst_element_post_message * gst_element_query -- gst_element_remove_pad -- gst_pad_link +* gst_element_remove_pad +* gst_element_factory_make +* gst_pad_link * gst_pad_pull_range * gst_pad_push * gst_pad_push_list * gst_pad_push_event -- gst_pad_unlink +* gst_pad_unlink Tracer api ---------- diff --git a/gst/gstbin.c b/gst/gstbin.c index 9190bfe3dd..2439b664d4 100644 --- a/gst/gstbin.c +++ b/gst/gstbin.c @@ -1370,7 +1370,9 @@ gst_bin_add (GstBin * bin, GstElement * element) GST_STR_NULL (GST_ELEMENT_NAME (element)), GST_STR_NULL (GST_ELEMENT_NAME (bin))); + GST_TRACER_BIN_ADD_PRE (bin, element); result = bclass->add_element (bin, element); + GST_TRACER_BIN_ADD_POST (bin, element, result); return result; @@ -1694,7 +1696,9 @@ gst_bin_remove (GstBin * bin, GstElement * element) GST_CAT_DEBUG (GST_CAT_PARENTAGE, "removing element %s from bin %s", GST_ELEMENT_NAME (element), GST_ELEMENT_NAME (bin)); + GST_TRACER_BIN_REMOVE_PRE (bin, element); result = bclass->remove_element (bin, element); + GST_TRACER_BIN_REMOVE_POST (bin, result); return result; diff --git a/gst/gstelement.c b/gst/gstelement.c index 2a783371ad..e7523bb25e 100644 --- a/gst/gstelement.c +++ b/gst/gstelement.c @@ -696,7 +696,7 @@ gst_element_add_pad (GstElement * element, GstPad * pad) /* emit the PAD_ADDED signal */ g_signal_emit (element, gst_element_signals[PAD_ADDED], 0, pad); - + GST_TRACER_ELEMENT_ADD_PAD (element, pad); return TRUE; /* ERROR cases */ @@ -808,7 +808,7 @@ gst_element_remove_pad (GstElement * element, GstPad * pad) /* emit the PAD_REMOVED signal before unparenting and losing the last ref. */ g_signal_emit (element, gst_element_signals[PAD_REMOVED], 0, pad); - + GST_TRACER_ELEMENT_REMOVE_PAD (element, pad); gst_object_unparent (GST_OBJECT_CAST (pad)); return TRUE; diff --git a/gst/gstelementfactory.c b/gst/gstelementfactory.c index 486b9fe018..39d43ab933 100644 --- a/gst/gstelementfactory.c +++ b/gst/gstelementfactory.c @@ -448,6 +448,9 @@ gst_element_factory_make (const gchar * factoryname, const gchar * name) goto create_failed; gst_object_unref (factory); + + GST_TRACER_ELEMENT_NEW (element); + return element; /* ERRORS */ diff --git a/gst/gstpad.c b/gst/gstpad.c index 3b0300c1da..c4f55625cd 100644 --- a/gst/gstpad.c +++ b/gst/gstpad.c @@ -1987,6 +1987,8 @@ gst_pad_unlink (GstPad * srcpad, GstPad * sinkpad) g_return_val_if_fail (GST_IS_PAD (sinkpad), FALSE); g_return_val_if_fail (GST_PAD_IS_SINK (sinkpad), FALSE); + GST_TRACER_PAD_UNLINK_PRE (srcpad, sinkpad); + GST_CAT_INFO (GST_CAT_ELEMENT_PADS, "unlinking %s:%s(%p) and %s:%s(%p)", GST_DEBUG_PAD_NAME (srcpad), srcpad, GST_DEBUG_PAD_NAME (sinkpad), sinkpad); @@ -2054,6 +2056,7 @@ done: GST_STRUCTURE_CHANGE_TYPE_PAD_UNLINK, parent, FALSE)); gst_object_unref (parent); } + GST_TRACER_PAD_UNLINK_POST (srcpad, sinkpad, result); return result; /* ERRORS */ @@ -2495,7 +2498,13 @@ link_failed: GstPadLinkReturn gst_pad_link (GstPad * srcpad, GstPad * sinkpad) { - return gst_pad_link_full (srcpad, sinkpad, GST_PAD_LINK_CHECK_DEFAULT); + GstPadLinkReturn ret; + + GST_TRACER_PAD_LINK_PRE (srcpad, sinkpad); + ret = gst_pad_link_full (srcpad, sinkpad, GST_PAD_LINK_CHECK_DEFAULT); + GST_TRACER_PAD_LINK_POST (srcpad, sinkpad, ret); + + return ret; } static void diff --git a/gst/gsttracerutils.c b/gst/gsttracerutils.c index ed27ba87ae..e7afa49e84 100644 --- a/gst/gsttracerutils.c +++ b/gst/gsttracerutils.c @@ -48,7 +48,10 @@ static const gchar *_quark_strings[] = { "pad-pull-range-pre", "pad-pull-range-post", "pad-push-event-pre", "pad-push-event-post", "pad-query-pre", "pad-query-post", "element-post-message-pre", - "element-post-message-post", "element-query-pre", "element-query-post" + "element-post-message-post", "element-query-pre", "element-query-post", + "element-new", "element-add-pad", "element-remove-pad", "bin-add-pre", + "bin-add-post", "bin-remove-pre", "bin-remove-post", "pad-link-pre", + "pad-link-post", "pad-unlink-pre", "pad-unlink-post" }; GQuark _priv_gst_tracer_quark_table[GST_TRACER_QUARK_MAX]; diff --git a/gst/gsttracerutils.h b/gst/gsttracerutils.h index 3d78fc8779..93f218f10a 100644 --- a/gst/gsttracerutils.h +++ b/gst/gsttracerutils.h @@ -61,6 +61,17 @@ typedef enum _GstTracerQuarkId GST_TRACER_QUARK_HOOK_ELEMENT_POST_MESSAGE_POST, GST_TRACER_QUARK_HOOK_ELEMENT_QUERY_PRE, GST_TRACER_QUARK_HOOK_ELEMENT_QUERY_POST, + GST_TRACER_QUARK_HOOK_ELEMENT_NEW, + GST_TRACER_QUARK_HOOK_ELEMENT_ADD_PAD, + GST_TRACER_QUARK_HOOK_ELEMENT_REMOVE_PAD, + GST_TRACER_QUARK_HOOK_BIN_ADD_PRE, + GST_TRACER_QUARK_HOOK_BIN_ADD_POST, + GST_TRACER_QUARK_HOOK_BIN_REMOVE_PRE, + GST_TRACER_QUARK_HOOK_BIN_REMOVE_POST, + GST_TRACER_QUARK_HOOK_PAD_LINK_PRE, + GST_TRACER_QUARK_HOOK_PAD_LINK_POST, + GST_TRACER_QUARK_HOOK_PAD_UNLINK_PRE, + GST_TRACER_QUARK_HOOK_PAD_UNLINK_POST, GST_TRACER_QUARK_MAX } GstTracerQuarkId; @@ -203,6 +214,83 @@ typedef void (*GstTracerHookElementQueryPost) (GObject *, GstClockTime, GstTracerHookElementQueryPost, (GST_TRACER_ARGS, element, res)); \ }G_STMT_END +typedef void (*GstTracerHookElementNew) (GObject *, GstClockTime, + GstElement *); +#define GST_TRACER_ELEMENT_NEW(element) G_STMT_START{ \ + GST_TRACER_DISPATCH(GST_TRACER_QUARK(HOOK_ELEMENT_NEW), \ + GstTracerHookElementNew, (GST_TRACER_ARGS, element)); \ +}G_STMT_END + +typedef void (*GstTracerHookElementAddPad) (GObject *, GstClockTime, + GstElement *, GstPad *); +#define GST_TRACER_ELEMENT_ADD_PAD(element, pad) G_STMT_START{ \ + GST_TRACER_DISPATCH(GST_TRACER_QUARK(HOOK_ELEMENT_ADD_PAD), \ + GstTracerHookElementAddPad, (GST_TRACER_ARGS, element, pad)); \ +}G_STMT_END + +typedef void (*GstTracerHookElementRemovePad) (GObject *, GstClockTime, + GstElement *, GstPad *); +#define GST_TRACER_ELEMENT_REMOVE_PAD(element, pad) G_STMT_START{ \ + GST_TRACER_DISPATCH(GST_TRACER_QUARK(HOOK_ELEMENT_REMOVE_PAD), \ + GstTracerHookElementRemovePad, (GST_TRACER_ARGS, element, pad)); \ +}G_STMT_END + +typedef void (*GstTracerHookBinAddPre) (GObject *, GstClockTime, + GstBin *, GstElement *); +#define GST_TRACER_BIN_ADD_PRE(bin, element) G_STMT_START{ \ + GST_TRACER_DISPATCH(GST_TRACER_QUARK(HOOK_BIN_ADD_PRE), \ + GstTracerHookBinAddPre, (GST_TRACER_ARGS, bin, element)); \ +}G_STMT_END + +typedef void (*GstTracerHookBinAddPost) (GObject *, GstClockTime, + GstBin *, GstElement *, gboolean); +#define GST_TRACER_BIN_ADD_POST(bin, element, result) G_STMT_START{ \ + GST_TRACER_DISPATCH(GST_TRACER_QUARK(HOOK_BIN_ADD_POST), \ + GstTracerHookBinAddPost, (GST_TRACER_ARGS, bin, element, result)); \ +}G_STMT_END + +typedef void (*GstTracerHookBinRemovePre) (GObject *, GstClockTime, + GstBin *, GstElement *); +#define GST_TRACER_BIN_REMOVE_PRE(bin, element) G_STMT_START{ \ + GST_TRACER_DISPATCH(GST_TRACER_QUARK(HOOK_BIN_REMOVE_PRE), \ + GstTracerHookBinRemovePre, (GST_TRACER_ARGS, bin, element)); \ +}G_STMT_END + +typedef void (*GstTracerHookBinRemovePost) (GObject *, GstClockTime, + GstBin *, gboolean); +#define GST_TRACER_BIN_REMOVE_POST(bin, result) G_STMT_START{ \ + GST_TRACER_DISPATCH(GST_TRACER_QUARK(HOOK_BIN_REMOVE_POST), \ + GstTracerHookBinRemovePost, (GST_TRACER_ARGS, bin, result)); \ +}G_STMT_END + +typedef void (*GstTracerHookPadLinkPre) (GObject *, GstClockTime, + GstPad *, GstPad *); +#define GST_TRACER_PAD_LINK_PRE(srcpad, sinkpad) G_STMT_START{ \ + GST_TRACER_DISPATCH(GST_TRACER_QUARK(HOOK_PAD_LINK_PRE), \ + GstTracerHookPadLinkPre, (GST_TRACER_ARGS, srcpad, sinkpad)); \ +}G_STMT_END + +typedef void (*GstTracerHookPadLinkPost) (GObject *, GstClockTime, + GstPad *, GstPad *, GstPadLinkReturn); +#define GST_TRACER_PAD_LINK_POST(srcpad, sinkpad, result) G_STMT_START{ \ + GST_TRACER_DISPATCH(GST_TRACER_QUARK(HOOK_PAD_LINK_POST), \ + GstTracerHookPadLinkPost, (GST_TRACER_ARGS, srcpad, sinkpad, result)); \ +}G_STMT_END + +typedef void (*GstTracerHookPadUnlinkPre) (GObject *, GstClockTime, + GstPad *, GstPad *); +#define GST_TRACER_PAD_UNLINK_PRE(srcpad, sinkpad) G_STMT_START{ \ + GST_TRACER_DISPATCH(GST_TRACER_QUARK(HOOK_PAD_UNLINK_PRE), \ + GstTracerHookPadUnlinkPre, (GST_TRACER_ARGS, srcpad, sinkpad)); \ +}G_STMT_END + +typedef void (*GstTracerHookPadUnlinkPost) (GObject *, GstClockTime, + GstPad *, GstPad *, gboolean); +#define GST_TRACER_PAD_UNLINK_POST(srcpad, sinkpad, result) G_STMT_START{ \ + GST_TRACER_DISPATCH(GST_TRACER_QUARK(HOOK_PAD_UNLINK_POST), \ + GstTracerHookPadUnlinkPost, (GST_TRACER_ARGS, srcpad, sinkpad, result)); \ +}G_STMT_END + #else /* !GST_DISABLE_GST_DEBUG */ #define GST_TRACER_PAD_PUSH_PRE(pad, buffer) @@ -219,6 +307,17 @@ typedef void (*GstTracerHookElementQueryPost) (GObject *, GstClockTime, #define GST_TRACER_ELEMENT_POST_MESSAGE_POST(element, res) #define GST_TRACER_ELEMENT_QUERY_PRE(element, query) #define GST_TRACER_ELEMENT_QUERY_POST(element, res) +#define GST_TRACER_ELEMENT_NEW(element), +#define GST_TRACER_ELEMENT_ADD_PAD(element, pad), +#define GST_TRACER_ELEMENT_REMOVE_PAD(element, pad), +#define GST_TRACER_BIN_ADD_PRE(bin, element), +#define GST_TRACER_BIN_ADD_POST(bin, element, res), +#define GST_TRACER_BIN_REMOVE_PRE(bin, element), +#define GST_TRACER_BIN_REMOVE_POST(bin, res), +#define GST_TRACER_PAD_LINK_PRE(srcpad, sinkpad), +#define GST_TRACER_PAD_LINK_POST(srcpad, sinkpad, res), +#define GST_TRACER_PAD_UNLINK_PRE(srcpad, sinkpad), +#define GST_TRACER_PAD_UNLINK_POST(srcpad, sinkpad, res), #endif /* GST_DISABLE_GST_DEBUG */