X-Git-Url: https://git.lttng.org/?p=lttng-tools.git;a=blobdiff_plain;f=src%2Fbin%2Flttng-sessiond%2Ftrace-ust.c;h=3881084f04fb4024b14970120e44e85c02b1d59d;hp=e74ed62ba894862394576d9991ba93e41ede9489;hb=b93a4a13a2724a73069e1d661df5df83c629bb36;hpb=a9ad0c8fb50ac8cf9e9812dd9c9b4f949bac19a8 diff --git a/src/bin/lttng-sessiond/trace-ust.c b/src/bin/lttng-sessiond/trace-ust.c index e74ed62ba..3881084f0 100644 --- a/src/bin/lttng-sessiond/trace-ust.c +++ b/src/bin/lttng-sessiond/trace-ust.c @@ -30,6 +30,7 @@ #include "trace-ust.h" #include "utils.h" #include "ust-app.h" +#include "agent.h" /* * Match function for the events hash table lookup. @@ -655,7 +656,7 @@ int pid_tracker_add_pid(struct ust_pid_tracker *pid_tracker, int pid) tracker_node = pid_tracker_lookup(pid_tracker, pid, &iter); if (tracker_node) { /* Already exists. */ - retval = LTTNG_ERR_INVALID; + retval = LTTNG_ERR_PID_TRACKED; goto end; } tracker_node = zmalloc(sizeof(*tracker_node)); @@ -683,7 +684,7 @@ int pid_tracker_del_pid(struct ust_pid_tracker *pid_tracker, int pid) tracker_node = pid_tracker_lookup(pid_tracker, pid, &iter); if (!tracker_node) { /* Not found */ - retval = LTTNG_ERR_INVALID; + retval = LTTNG_ERR_PID_NOT_TRACKED; goto end; } ret = lttng_ht_del(pid_tracker->ht, &iter); @@ -808,6 +809,50 @@ end: return retval; } +/* + * Called with session lock held. + */ +ssize_t trace_ust_list_tracker_pids(struct ltt_ust_session *session, + int32_t **_pids) +{ + struct ust_pid_tracker_node *tracker_node; + struct lttng_ht_iter iter; + unsigned long count, i = 0; + long approx[2]; + int32_t *pids; + int ret = 0; + + if (!session->pid_tracker.ht) { + /* Tracker disabled. Set first entry to -1. */ + pids = zmalloc(sizeof(*pids)); + if (!pids) { + ret = -1; + goto end; + } + pids[0] = -1; + *_pids = pids; + return 1; + } + + rcu_read_lock(); + cds_lfht_count_nodes(session->pid_tracker.ht->ht, + &approx[0], &count, &approx[1]); + pids = zmalloc(sizeof(*pids) * count); + if (!pids) { + ret = -1; + goto end; + } + cds_lfht_for_each_entry(session->pid_tracker.ht->ht, + &iter.iter, tracker_node, node.node) { + pids[i++] = tracker_node->node.key; + } + *_pids = pids; + ret = count; +end: + rcu_read_unlock(); + return ret; +} + /* * RCU safe free context structure. */