tools: print async node state in pw-top

Pass the node async state in the profiler and use this in pw-top to draw
the node with = instead of a + in the tree when it's async.
This commit is contained in:
Wim Taymans 2025-09-15 12:29:57 +02:00
parent 09cd7bf783
commit f89428d9f8
4 changed files with 11 additions and 7 deletions

View file

@ -14,7 +14,7 @@ node and device statistics.
A hierarchical view is shown of Driver nodes and follower nodes. The A hierarchical view is shown of Driver nodes and follower nodes. The
Driver nodes are actively using a timer to schedule dataflow in the Driver nodes are actively using a timer to schedule dataflow in the
followers. The followers of a driver node as shown below their driver followers. The followers of a driver node as shown below their driver
with a + sign in a tree-like representation. with a + sign (or = for async nodes) in a tree-like representation.
The columns presented are as follows: The columns presented are as follows:
@ -173,8 +173,8 @@ For Video formats, the layout is \<pixelformat\>
\parblock \parblock
Name assigned to the device/node, as found in *pw-dump* node.name Name assigned to the device/node, as found in *pw-dump* node.name
Names are prefixed by *+* when they are linked to a driver (entry Names are prefixed by *+*/*=* when they are linked to a driver (entry
above with no +) above with no +/=)
\endparblock \endparblock
# COMMANDS # COMMANDS

View file

@ -66,7 +66,8 @@ enum spa_profiler {
* Long : finish, * Long : finish,
* Int : status, * Int : status,
* Fraction : latency, * Fraction : latency,
* Int : xrun_count)) */ * Int : xrun_count))
* Bool : async)) */
SPA_PROFILER_followerClock, /**< follower clock information SPA_PROFILER_followerClock, /**< follower clock information
* (Struct( * (Struct(
* Int : clock id, * Int : clock id,

View file

@ -298,7 +298,8 @@ static void context_do_profile(void *data)
SPA_POD_Long(n->async ? na->prev_finish_time : na->finish_time), SPA_POD_Long(n->async ? na->prev_finish_time : na->finish_time),
SPA_POD_Int(na->status), SPA_POD_Int(na->status),
SPA_POD_Fraction(&latency), SPA_POD_Fraction(&latency),
SPA_POD_Int(na->xrun_count)); SPA_POD_Int(na->xrun_count),
SPA_POD_Bool(n->async));
if (n->driver) { if (n->driver) {
spa_pod_builder_prop(&b, SPA_PROFILER_followerClock, 0); spa_pod_builder_prop(&b, SPA_PROFILER_followerClock, 0);

View file

@ -44,6 +44,7 @@ struct measurement {
int64_t finish; int64_t finish;
struct spa_fraction latency; struct spa_fraction latency;
uint32_t xrun_count; uint32_t xrun_count;
bool async;
}; };
struct node { struct node {
@ -419,7 +420,8 @@ static int process_follower_block(struct data *d, const struct spa_pod *pod, str
SPA_POD_Long(&m.finish), SPA_POD_Long(&m.finish),
SPA_POD_Int(&m.status), SPA_POD_Int(&m.status),
SPA_POD_Fraction(&m.latency), SPA_POD_Fraction(&m.latency),
SPA_POD_OPT_Int(&m.xrun_count))) < 0) SPA_POD_OPT_Int(&m.xrun_count),
SPA_POD_OPT_Bool(&m.async))) < 0)
return res; return res;
if ((n = find_node(d, id)) == NULL) if ((n = find_node(d, id)) == NULL)
@ -540,7 +542,7 @@ static void print_node(struct data *d, struct node *dr, struct node *n, int y)
i->xrun_count - dr->info_base : i->xrun_count - dr->info_base :
n->measurement.xrun_count - n->measurement_base, n->measurement.xrun_count - n->measurement_base,
active ? n->format : "", active ? n->format : "",
n->driver == n ? "" : " + ", n->driver == n ? "" : n->measurement.async ? " = " : " + ",
n->name); n->name);
} }