summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStefan Kost <ensonic@users.sf.net>2010-10-09 00:36:47 +0300
committerStefan Kost <ensonic@users.sf.net>2010-10-09 00:36:47 +0300
commit0bf25b5effcf301fc29e5dae32736f49d02dfbac (patch)
tree12628978fefcfedfd5128fd9397e5853f2c2b551
parent316061a12bba72f823cd92dc791b367547ab032a (diff)
tracelib: drop separate bin array
We need to have unique sequence numbers for bins and elements. Now that we don't use hashtables anymore it is also easier to just have one ptr-array.
-rw-r--r--src/gsttracelib.c110
1 files changed, 50 insertions, 60 deletions
diff --git a/src/gsttracelib.c b/src/gsttracelib.c
index 80b09a5..2ac90c9 100644
--- a/src/gsttracelib.c
+++ b/src/gsttracelib.c
@@ -87,7 +87,6 @@ static gboolean gsttl_do_log_topo = TRUE;
/* global statistics */
static GHashTable *threads = NULL;
static GPtrArray *elements = NULL;
-static GPtrArray *bins = NULL;
static GPtrArray *pads = NULL;
static guint max_qos = 0;
static gboolean check_cpuload = FALSE;
@@ -455,10 +454,9 @@ _fill_element_stats (GstElement *element)
GsttlElementStats *stats = g_new0(GsttlElementStats,1);
if(GST_IS_BIN(element)) {
- stats->index = num_bins++;
- } else {
- stats->index = num_elements++;
+ num_bins++;
}
+ stats->index = num_elements++;
stats->type = G_OBJECT_TYPE (element);
stats->first_ts = GST_CLOCK_TIME_NONE;
stats->parent_ix = G_MAXUINT;
@@ -466,15 +464,13 @@ _fill_element_stats (GstElement *element)
}
static GsttlElementStats*
-_get_bin_stats_by_id (guint ix)
+_get_element_stats_by_id (guint ix)
{
- return g_ptr_array_index (bins, ix);
+ return g_ptr_array_index (elements, ix);
}
-static GsttlElementStats* _get_bin_stats (GstElement *element);
-
static inline GsttlElementStats*
-_get_bin_or_element_stats (GstElement *element, GPtrArray *arr)
+_get_element_stats (GstElement *element)
{
GsttlElementStats *stats;
@@ -482,15 +478,15 @@ _get_bin_or_element_stats (GstElement *element, GPtrArray *arr)
if (!(stats = g_object_get_qdata ((GObject *)element, data_quark))) {
stats = _fill_element_stats (element);
g_object_set_qdata ((GObject *)element, data_quark, stats);
- if (arr->len <= stats->index)
- g_ptr_array_set_size (arr, stats->index+1);
- g_ptr_array_index (arr, stats->index) = stats;
+ if (elements->len <= stats->index)
+ g_ptr_array_set_size (elements, stats->index+1);
+ g_ptr_array_index (elements, stats->index) = stats;
}
G_UNLOCK (_stats);
if(G_UNLIKELY(stats->parent_ix == G_MAXUINT)) {
GstElement *parent = GST_ELEMENT_PARENT (element);
if(parent) {
- GsttlElementStats *parent_stats = _get_bin_stats (parent);
+ GsttlElementStats *parent_stats = _get_element_stats (parent);
stats->parent_ix = parent_stats->index;
}
}
@@ -502,25 +498,6 @@ _get_bin_or_element_stats (GstElement *element, GPtrArray *arr)
return stats;
}
-static GsttlElementStats*
-_get_bin_stats (GstElement *element)
-{
- if (!element)
- return NULL;
-
- g_assert(GST_IS_BIN(element));
- return _get_bin_or_element_stats (element, bins);
-}
-
-static GsttlElementStats*
-_get_element_stats (GstElement *element)
-{
- if (!element)
- return NULL;
-
- g_assert(!GST_IS_BIN(element));
- return _get_bin_or_element_stats (element, elements);
-}
/* FIXME: this looks a bit weired, check that we really want to do this
*
@@ -593,7 +570,7 @@ _get_pad_stats (GstPad *pad)
/* yes we leak the names right now ... */
if (GST_IS_ELEMENT (parent)) {
/* pad is regular pad */
- GST_IS_BIN (parent) ? _get_bin_stats (GST_ELEMENT_CAST(parent)) : _get_element_stats (GST_ELEMENT_CAST(parent));
+ _get_element_stats (GST_ELEMENT_CAST(parent));
if(GST_OBJECT_NAME(parent) && GST_OBJECT_NAME(pad)) {
stats->name = g_strdup_printf ("%s_%s", GST_OBJECT_NAME(parent), GST_OBJECT_NAME(pad));
}
@@ -767,7 +744,7 @@ _accum_element_stats (gpointer value, gpointer user_data)
GsttlElementStats *stats=(GsttlElementStats *)value;
if (stats->parent_ix != G_MAXUINT) {
- GsttlElementStats *parent_stats = _get_bin_stats_by_id (stats->parent_ix);
+ GsttlElementStats *parent_stats = _get_element_stats_by_id (stats->parent_ix);
parent_stats->num_events += stats->num_events;
parent_stats->num_messages += stats->num_messages;
@@ -810,11 +787,23 @@ _sort_element_stats_by_first_activity (gconstpointer es1, gconstpointer es2)
}
static void
+_sort_bin_stats (gpointer value, gpointer user_data)
+{
+ if (g_type_is_a (((GsttlElementStats *)value)->type, GST_TYPE_BIN)) {
+ GSList **list=user_data;
+
+ *list = g_slist_insert_sorted (*list, value, _sort_element_stats_by_first_activity);
+ }
+}
+
+static void
_sort_element_stats (gpointer value, gpointer user_data)
{
- GSList **list=user_data;
-
- *list = g_slist_insert_sorted (*list, value, _sort_element_stats_by_first_activity);
+ if (!g_type_is_a (((GsttlElementStats *)value)->type, GST_TYPE_BIN)) {
+ GSList **list=user_data;
+
+ *list = g_slist_insert_sorted (*list, value, _sort_element_stats_by_first_activity);
+ }
}
static gboolean
@@ -918,7 +907,7 @@ _do_transmission_stats(GstPad *pad, GstBuffer *buf, GstClockTimeDiff elapsed)
{
GstObject *parent = GST_OBJECT_PARENT (pad);
GstElement *this = GST_ELEMENT_CAST (GST_IS_PAD (parent) ? GST_OBJECT_PARENT (parent) : parent);
- GsttlElementStats *this_stats = GST_IS_BIN (this) ? _get_bin_stats (this) : _get_element_stats (this);
+ GsttlElementStats *this_stats = _get_element_stats (this);
GstPad *peer_pad = GST_PAD_PEER (pad);
GsttlElementStats *peer_stats;
GSList *node,*bin_i_stats=NULL,*bin_o_stats=NULL;
@@ -934,7 +923,7 @@ _do_transmission_stats(GstPad *pad, GstBuffer *buf, GstClockTimeDiff elapsed)
/* if this is now the ghost pad, get the peer of this */
_get_pad_stats (peer_pad);
if (parent = GST_OBJECT_PARENT (peer_pad)) {
- peer_stats = _get_bin_stats (GST_ELEMENT_CAST (parent));
+ peer_stats = _get_element_stats (GST_ELEMENT_CAST (parent));
bin_o_stats = g_slist_prepend (bin_o_stats, peer_stats);
}
peer_pad = GST_PAD_PEER (GST_GHOST_PAD_CAST (peer_pad));
@@ -945,7 +934,7 @@ _do_transmission_stats(GstPad *pad, GstBuffer *buf, GstClockTimeDiff elapsed)
* a proxy_pad */
while (peer_pad && GST_IS_GHOST_PAD(peer_pad)) {
_get_pad_stats (peer_pad);
- peer_stats = _get_bin_stats (GST_ELEMENT_CAST(parent));
+ peer_stats = _get_element_stats (GST_ELEMENT_CAST(parent));
bin_i_stats = g_slist_prepend (bin_i_stats, peer_stats);
peer_pad = gst_ghost_pad_get_target (GST_GHOST_PAD_CAST(peer_pad));
parent = peer_pad ? GST_OBJECT_PARENT (peer_pad) : NULL;
@@ -956,7 +945,7 @@ _do_transmission_stats(GstPad *pad, GstBuffer *buf, GstClockTimeDiff elapsed)
GST_TIME_ARGS(elapsed), GST_DEBUG_PAD_NAME (peer_pad));
return;
}
- peer_stats = GST_IS_BIN (parent) ? _get_bin_stats (GST_ELEMENT_CAST(parent)) : _get_element_stats (GST_ELEMENT_CAST(parent));
+ peer_stats = _get_element_stats (GST_ELEMENT_CAST(parent));
if(GST_PAD_DIRECTION(pad) == GST_PAD_SRC) {
/* push */
@@ -1019,7 +1008,7 @@ _do_element_stats(GstPad *pad, GstClockTimeDiff elapsed1, GstClockTimeDiff elaps
GstClockTimeDiff elapsed = GST_CLOCK_DIFF (elapsed1,elapsed2);
GstObject *parent = GST_OBJECT_PARENT (pad);
GstElement *this = GST_ELEMENT_CAST (GST_IS_PAD (parent) ? GST_OBJECT_PARENT (parent) : parent);
- GsttlElementStats *this_stats = GST_IS_BIN (this) ? _get_bin_stats (this) : _get_element_stats (this);
+ GsttlElementStats *this_stats = _get_element_stats (this);
GstPad *peer_pad = GST_PAD_PEER (pad);
GsttlElementStats *peer_stats;
@@ -1034,7 +1023,7 @@ _do_element_stats(GstPad *pad, GstClockTimeDiff elapsed1, GstClockTimeDiff elaps
/* if this is now the ghost pad, get the peer of this */
_get_pad_stats (peer_pad);
if (parent = GST_OBJECT_PARENT (peer_pad)) {
- _get_bin_stats (GST_ELEMENT_CAST (parent));
+ _get_element_stats (GST_ELEMENT_CAST (parent));
}
peer_pad = GST_PAD_PEER (GST_GHOST_PAD_CAST (peer_pad));
parent = peer_pad ? GST_OBJECT_PARENT (peer_pad) : NULL;
@@ -1044,7 +1033,7 @@ _do_element_stats(GstPad *pad, GstClockTimeDiff elapsed1, GstClockTimeDiff elaps
* a proxy_pad */
while (peer_pad && GST_IS_GHOST_PAD(peer_pad)) {
_get_pad_stats (peer_pad);
- _get_bin_stats (GST_ELEMENT_CAST(parent));
+ _get_element_stats (GST_ELEMENT_CAST(parent));
peer_pad = gst_ghost_pad_get_target (GST_GHOST_PAD_CAST(peer_pad));
parent = peer_pad ? GST_OBJECT_PARENT (peer_pad) : NULL;
}
@@ -1056,7 +1045,7 @@ _do_element_stats(GstPad *pad, GstClockTimeDiff elapsed1, GstClockTimeDiff elaps
GST_TIME_ARGS(elapsed), pad_stats->name, GST_DEBUG_PAD_NAME (peer_pad));
return;
}
- peer_stats = GST_IS_BIN (parent) ? _get_bin_stats (GST_ELEMENT_CAST(parent)) : _get_element_stats (GST_ELEMENT_CAST(parent));
+ peer_stats = _get_element_stats (GST_ELEMENT_CAST(parent));
/* we'd like to gather time spend in each element, but this does not make too
* much sense yet
@@ -1210,7 +1199,7 @@ gst_pad_send_event (GstPad *pad, GstEvent *event)
parent = _get_real_pad_parent(real_pad);
if(element = GST_ELEMENT (parent)) {
- stats = GST_IS_BIN (element) ? _get_bin_stats (element) : _get_element_stats (element);
+ stats = _get_element_stats (element);
pad_stats = _get_pad_stats (pad);
peer_pad_stats = _get_pad_stats (peer_pad);
@@ -1275,7 +1264,7 @@ gst_element_post_message (GstElement *element, GstMessage *message)
GsttlElementStats *stats;
gboolean ret;
- stats = GST_IS_BIN (element) ? _get_bin_stats (element) : _get_element_stats (element);
+ stats = _get_element_stats (element);
switch (GST_MESSAGE_TYPE (message)) {
case GST_MESSAGE_STATE_CHANGED: {
@@ -1323,7 +1312,7 @@ gst_element_query (GstElement *element, GstQuery *query)
GsttlElementStats *stats;
gboolean ret;
- stats = GST_IS_BIN (element) ? _get_bin_stats (element) : _get_element_stats (element);
+ stats = _get_element_stats (element);
stats->num_queries++;
num_queries++;
@@ -1422,8 +1411,8 @@ gst_bin_add (GstBin *bin, GstElement *element)
if (gsttl_do_log_topo) {
gboolean is_bin = GST_IS_BIN (element);
- GsttlElementStats *bin_stats = _get_bin_stats ((GstElement *)bin);
- GsttlElementStats *elem_stats = is_bin ? _get_bin_stats (element) : _get_element_stats (element);
+ GsttlElementStats *bin_stats = _get_element_stats ((GstElement *)bin);
+ GsttlElementStats *elem_stats = _get_element_stats (element);
_log_entry(
"topo_bin_add %" GST_TIME_FORMAT " %lf %u %s %u %s %1d\n",
@@ -1451,8 +1440,8 @@ gst_bin_remove (GstBin *bin, GstElement *element)
if (gsttl_do_log_topo) {
gboolean is_bin = GST_IS_BIN (element);
- GsttlElementStats *bin_stats = _get_bin_stats ((GstElement *)bin);
- GsttlElementStats *elem_stats = is_bin ? _get_bin_stats (element) : _get_element_stats (element);
+ GsttlElementStats *bin_stats = _get_element_stats ((GstElement *)bin);
+ GsttlElementStats *elem_stats = _get_element_stats (element);
_log_entry(
"topo_bin_rem %" GST_TIME_FORMAT " %lf %u %s %u %s %1d\n",
@@ -1485,7 +1474,7 @@ gst_element_add_pad (GstElement *element, GstPad *pad)
if (gsttl_do_log_topo) {
gboolean is_ghost = GST_IS_GHOST_PAD (pad);
- GsttlElementStats *elem_stats = GST_IS_BIN (element) ? _get_bin_stats (element) : _get_element_stats (element);
+ GsttlElementStats *elem_stats = _get_element_stats (element);
GsttlPadStats *pad_stats = _get_pad_stats (pad);
guint details = _get_pad_details (pad, (is_ghost?1:0));
@@ -1537,7 +1526,7 @@ gst_element_remove_pad (GstElement *element, GstPad *pad)
if (gsttl_do_log_topo) {
gboolean is_ghost = GST_IS_GHOST_PAD (pad);
- GsttlElementStats *elem_stats = GST_IS_BIN (element) ? _get_bin_stats (element) : _get_element_stats (element);
+ GsttlElementStats *elem_stats = _get_element_stats (element);
GsttlPadStats *pad_stats = _get_pad_stats (pad);
guint details;
@@ -1803,7 +1792,6 @@ gst_preload_init (void)
/* init structures to gather stats */
data_quark = g_quark_from_static_string ("gsttl:data");
elements = g_ptr_array_new_with_free_func ((GDestroyNotify)g_free);
- bins = g_ptr_array_new_with_free_func ((GDestroyNotify)g_free);
pads = g_ptr_array_new_with_free_func ((GDestroyNotify)g_free);
threads = g_hash_table_new_full (NULL,NULL,NULL,(GDestroyNotify)g_free);
@@ -1877,7 +1865,7 @@ gst_preload_done (void)
/* print overall stats */
puts("\nOverall Statistics:");
printf("Number of Threads: %u\n", num_threads);
- printf("Number of Elements: %u\n", num_elements);
+ printf("Number of Elements: %u\n", num_elements - num_bins);
printf("Number of Bins: %u\n", num_bins);
printf("Number of Pads: %u\n", num_pads - num_ghostpads);
printf("Number of GhostPads: %u\n", num_ghostpads);
@@ -1923,15 +1911,18 @@ gst_preload_done (void)
puts("Bin Statistics:");
/* attribute bin stats to parent-bins */
- for (i = 0; i < num_bins; i++) {
- g_hash_table_insert (accum_bins, GUINT_TO_POINTER(i), g_ptr_array_index (bins, i));
+ for (i = 0; i < num_elements; i++) {
+ GsttlElementStats *stats = g_ptr_array_index (elements, i);
+ if (g_type_is_a (stats->type, GST_TYPE_BIN)) {
+ g_hash_table_insert (accum_bins, GUINT_TO_POINTER(i), stats);
+ }
}
while(g_hash_table_size (accum_bins)) {
g_hash_table_foreach_remove (accum_bins, _process_leaf_bins, accum_bins);
}
g_hash_table_destroy (accum_bins);
/* sort by first_activity */
- g_ptr_array_foreach(bins,_sort_element_stats,&list);
+ g_ptr_array_foreach(elements,_sort_bin_stats,&list);
g_slist_foreach(list,_print_element_stats, NULL);
puts("");
g_slist_free(list);
@@ -1961,7 +1952,6 @@ done:
g_free (log_buf);
}
g_ptr_array_free (pads, TRUE);
- g_ptr_array_free (bins, TRUE);
g_ptr_array_free (elements, TRUE);
g_hash_table_destroy (threads);