mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-12-24 17:20:36 +00:00
stats: improve the handling of parentage
Log new object after we did the check for parents.
This commit is contained in:
parent
81e617fa70
commit
0c26387e62
2 changed files with 62 additions and 31 deletions
|
@ -87,20 +87,25 @@ fill_element_stats (GstStatsTracer * self, GstElement * element)
|
|||
|
||||
stats->index = self->num_elements++;
|
||||
stats->parent_ix = G_MAXUINT;
|
||||
return stats;
|
||||
}
|
||||
|
||||
static void
|
||||
log_new_element_stats (GstElementStats * stats, GstElement * element)
|
||||
{
|
||||
log_trace (gst_structure_new ("new-element",
|
||||
"ix", G_TYPE_UINT, stats->index,
|
||||
"parent-ix", G_TYPE_UINT, stats->parent_ix,
|
||||
"name", G_TYPE_STRING, GST_OBJECT_NAME (element),
|
||||
"type", G_TYPE_STRING, G_OBJECT_TYPE_NAME (element),
|
||||
"is-bin", G_TYPE_BOOLEAN, GST_IS_BIN (element), NULL));
|
||||
|
||||
return stats;
|
||||
}
|
||||
|
||||
static inline GstElementStats *
|
||||
get_element_stats (GstStatsTracer * self, GstElement * element)
|
||||
{
|
||||
GstElementStats *stats;
|
||||
gboolean is_new = FALSE;
|
||||
|
||||
if (!element) {
|
||||
no_elem_stats.index = G_MAXUINT;
|
||||
|
@ -114,6 +119,7 @@ get_element_stats (GstStatsTracer * self, GstElement * element)
|
|||
if (self->elements->len <= stats->index)
|
||||
g_ptr_array_set_size (self->elements, stats->index + 1);
|
||||
g_ptr_array_index (self->elements, stats->index) = stats;
|
||||
is_new = TRUE;
|
||||
}
|
||||
G_UNLOCK (_stats);
|
||||
if (G_UNLIKELY (stats->parent_ix == G_MAXUINT)) {
|
||||
|
@ -123,6 +129,9 @@ get_element_stats (GstStatsTracer * self, GstElement * element)
|
|||
stats->parent_ix = parent_stats->index;
|
||||
}
|
||||
}
|
||||
if (G_UNLIKELY (is_new)) {
|
||||
log_new_element_stats (stats, element);
|
||||
}
|
||||
return stats;
|
||||
}
|
||||
|
||||
|
@ -132,27 +141,6 @@ free_element_stats (gpointer data)
|
|||
g_slice_free (GstElementStats, data);
|
||||
}
|
||||
|
||||
static GstPadStats no_pad_stats = { 0, };
|
||||
|
||||
static GstPadStats *
|
||||
fill_pad_stats (GstStatsTracer * self, GstPad * pad)
|
||||
{
|
||||
GstPadStats *stats = g_slice_new0 (GstPadStats);
|
||||
|
||||
stats->index = self->num_pads++;
|
||||
stats->parent_ix = G_MAXUINT;
|
||||
|
||||
log_trace (gst_structure_new ("new-pad",
|
||||
"ix", G_TYPE_UINT, stats->index,
|
||||
"name", G_TYPE_STRING, GST_OBJECT_NAME (pad),
|
||||
"type", G_TYPE_STRING, G_OBJECT_TYPE_NAME (pad),
|
||||
"is-ghostpad", G_TYPE_BOOLEAN, GST_IS_GHOST_PAD (pad),
|
||||
"pad-direction", GST_TYPE_PAD_DIRECTION, GST_PAD_DIRECTION (pad),
|
||||
"thread-id", G_TYPE_UINT, GPOINTER_TO_UINT (g_thread_self ()), NULL));
|
||||
|
||||
return stats;
|
||||
}
|
||||
|
||||
/*
|
||||
* Get the element/bin owning the pad.
|
||||
*
|
||||
|
@ -192,10 +180,37 @@ get_real_pad_parent (GstPad * pad)
|
|||
return GST_ELEMENT_CAST (parent);
|
||||
}
|
||||
|
||||
static GstPadStats no_pad_stats = { 0, };
|
||||
|
||||
static GstPadStats *
|
||||
fill_pad_stats (GstStatsTracer * self, GstPad * pad)
|
||||
{
|
||||
GstPadStats *stats = g_slice_new0 (GstPadStats);
|
||||
|
||||
stats->index = self->num_pads++;
|
||||
stats->parent_ix = G_MAXUINT;
|
||||
|
||||
return stats;
|
||||
}
|
||||
|
||||
static void
|
||||
log_new_pad_stats (GstPadStats * stats, GstPad * pad)
|
||||
{
|
||||
log_trace (gst_structure_new ("new-pad",
|
||||
"ix", G_TYPE_UINT, stats->index,
|
||||
"parent-ix", G_TYPE_UINT, stats->parent_ix,
|
||||
"name", G_TYPE_STRING, GST_OBJECT_NAME (pad),
|
||||
"type", G_TYPE_STRING, G_OBJECT_TYPE_NAME (pad),
|
||||
"is-ghostpad", G_TYPE_BOOLEAN, GST_IS_GHOST_PAD (pad),
|
||||
"pad-direction", GST_TYPE_PAD_DIRECTION, GST_PAD_DIRECTION (pad),
|
||||
"thread-id", G_TYPE_UINT, GPOINTER_TO_UINT (g_thread_self ()), NULL));
|
||||
}
|
||||
|
||||
static GstPadStats *
|
||||
get_pad_stats (GstStatsTracer * self, GstPad * pad)
|
||||
{
|
||||
GstPadStats *stats;
|
||||
gboolean is_new = FALSE;
|
||||
|
||||
if (!pad) {
|
||||
no_pad_stats.index = G_MAXUINT;
|
||||
|
@ -209,6 +224,7 @@ get_pad_stats (GstStatsTracer * self, GstPad * pad)
|
|||
if (self->pads->len <= stats->index)
|
||||
g_ptr_array_set_size (self->pads, stats->index + 1);
|
||||
g_ptr_array_index (self->pads, stats->index) = stats;
|
||||
is_new = TRUE;
|
||||
}
|
||||
G_UNLOCK (_stats);
|
||||
if (G_UNLIKELY (stats->parent_ix == G_MAXUINT)) {
|
||||
|
@ -219,6 +235,9 @@ get_pad_stats (GstStatsTracer * self, GstPad * pad)
|
|||
stats->parent_ix = elem_stats->index;
|
||||
}
|
||||
}
|
||||
if (G_UNLIKELY (is_new)) {
|
||||
log_new_pad_stats (stats, pad);
|
||||
}
|
||||
return stats;
|
||||
}
|
||||
|
||||
|
@ -461,15 +480,17 @@ do_push_event_pre (GstStatsTracer * self, va_list var_args)
|
|||
{
|
||||
guint64 ts = va_arg (var_args, guint64);
|
||||
GstPad *pad = va_arg (var_args, GstPad *);
|
||||
GstEvent *ev = va_arg (var_args, GstEvent *);
|
||||
GstElement *elem = get_real_pad_parent (pad);
|
||||
GstPadStats *pad_stats = get_pad_stats (self, pad);
|
||||
GstElementStats *elem_stats = get_element_stats (self, elem);
|
||||
GstPadStats *pad_stats = get_pad_stats (self, pad);
|
||||
|
||||
elem_stats->last_ts = ts;
|
||||
log_trace (gst_structure_new ("event",
|
||||
"ts", G_TYPE_UINT64, ts,
|
||||
"pad-ix", G_TYPE_UINT, pad_stats->index,
|
||||
"elem-ix", G_TYPE_UINT, elem_stats->index, NULL));
|
||||
"elem-ix", G_TYPE_UINT, elem_stats->index,
|
||||
"name", G_TYPE_STRING, GST_EVENT_TYPE_NAME (ev), NULL));
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -486,11 +507,14 @@ do_post_message_pre (GstStatsTracer * self, va_list var_args)
|
|||
{
|
||||
guint64 ts = va_arg (var_args, guint64);
|
||||
GstElement *elem = va_arg (var_args, GstElement *);
|
||||
GstMessage *msg = va_arg (var_args, GstMessage *);
|
||||
GstElementStats *stats = get_element_stats (self, elem);
|
||||
|
||||
stats->last_ts = ts;
|
||||
log_trace (gst_structure_new ("message",
|
||||
"ts", G_TYPE_UINT64, ts, "elem-ix", G_TYPE_UINT, stats->index, NULL));
|
||||
"ts", G_TYPE_UINT64, ts,
|
||||
"elem-ix", G_TYPE_UINT, stats->index,
|
||||
"name", G_TYPE_STRING, GST_MESSAGE_TYPE_NAME (msg), NULL));
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -507,11 +531,14 @@ do_query_pre (GstStatsTracer * self, va_list var_args)
|
|||
{
|
||||
guint64 ts = va_arg (var_args, guint64);
|
||||
GstElement *elem = va_arg (var_args, GstElement *);
|
||||
GstQuery *qry = va_arg (var_args, GstQuery *);
|
||||
GstElementStats *stats = get_element_stats (self, elem);
|
||||
|
||||
stats->last_ts = ts;
|
||||
log_trace (gst_structure_new ("query",
|
||||
"ts", G_TYPE_UINT64, ts, "elem-ix", G_TYPE_UINT, stats->index, NULL));
|
||||
"ts", G_TYPE_UINT64, ts,
|
||||
"elem-ix", G_TYPE_UINT, stats->index,
|
||||
"name", G_TYPE_STRING, GST_QUERY_TYPE_NAME (qry), NULL));
|
||||
}
|
||||
|
||||
static void
|
||||
|
|
|
@ -117,7 +117,7 @@ static void
|
|||
new_pad_stats (GstStructure * s)
|
||||
{
|
||||
GstPadStats *stats;
|
||||
guint ix;
|
||||
guint ix, parent_ix;
|
||||
gchar *type, *name;
|
||||
gboolean is_ghost_pad;
|
||||
GstPadDirection dir;
|
||||
|
@ -125,6 +125,7 @@ new_pad_stats (GstStructure * s)
|
|||
|
||||
gst_structure_get (s,
|
||||
"ix", G_TYPE_UINT, &ix,
|
||||
"parent-ix", G_TYPE_UINT, &parent_ix,
|
||||
"name", G_TYPE_STRING, &name,
|
||||
"type", G_TYPE_STRING, &type,
|
||||
"is-ghostpad", G_TYPE_BOOLEAN, &is_ghost_pad,
|
||||
|
@ -143,6 +144,7 @@ new_pad_stats (GstStructure * s)
|
|||
stats->min_size = G_MAXUINT;
|
||||
stats->first_ts = stats->last_ts = stats->next_ts = GST_CLOCK_TIME_NONE;
|
||||
stats->thread_id = thread_id;
|
||||
stats->parent_ix = parent_ix;
|
||||
|
||||
if (pads->len <= ix)
|
||||
g_ptr_array_set_size (pads, ix + 1);
|
||||
|
@ -162,12 +164,13 @@ static void
|
|||
new_element_stats (GstStructure * s)
|
||||
{
|
||||
GstElementStats *stats;
|
||||
guint ix;
|
||||
guint ix, parent_ix;
|
||||
gchar *type, *name;
|
||||
gboolean is_bin;
|
||||
|
||||
gst_structure_get (s,
|
||||
"ix", G_TYPE_UINT, &ix,
|
||||
"parent-ix", G_TYPE_UINT, &parent_ix,
|
||||
"name", G_TYPE_STRING, &name,
|
||||
"type", G_TYPE_STRING, &type, "is-bin", G_TYPE_BOOLEAN, &is_bin, NULL);
|
||||
|
||||
|
@ -180,7 +183,7 @@ new_element_stats (GstStructure * s)
|
|||
stats->type_name = type;
|
||||
stats->is_bin = is_bin;
|
||||
stats->first_ts = GST_CLOCK_TIME_NONE;
|
||||
stats->parent_ix = G_MAXUINT;
|
||||
stats->parent_ix = parent_ix;
|
||||
|
||||
if (elements->len <= ix)
|
||||
g_ptr_array_set_size (elements, ix + 1);
|
||||
|
@ -321,7 +324,8 @@ do_event_stats (GstStructure * s)
|
|||
return;
|
||||
}
|
||||
if (!(elem_stats = get_element_stats (elem_ix))) {
|
||||
GST_WARNING ("no element stats found for ix=%u", elem_ix);
|
||||
// e.g. reconfigure events are send over unparented pads
|
||||
GST_INFO ("no element stats found for ix=%u", elem_ix);
|
||||
return;
|
||||
}
|
||||
elem_stats->num_events++;
|
||||
|
|
Loading…
Reference in a new issue