+ /* Call all the "trace is static" listeners */
+ for (i = 0; i < trace->is_static_listeners->len; i++) {
+ struct bt_ctf_trace_is_static_listener_elem elem =
+ g_array_index(trace->is_static_listeners,
+ struct bt_ctf_trace_is_static_listener_elem, i);
+
+ if (elem.func) {
+ elem.func(trace, elem.data);
+ }
+ }
+
+end:
+ return ret;
+}
+
+int bt_ctf_trace_add_is_static_listener(struct bt_ctf_trace *trace,
+ bt_ctf_trace_is_static_listener listener, void *data)
+{
+ int i;
+ struct bt_ctf_trace_is_static_listener_elem new_elem = {
+ .func = listener,
+ .data = data,
+ };
+
+ if (!trace) {
+ BT_LOGW_STR("Invalid parameter: trace is NULL.");
+ i = -1;
+ goto end;
+ }
+
+ if (!listener) {
+ BT_LOGW_STR("Invalid parameter: listener is NULL.");
+ i = -1;
+ goto end;
+ }
+
+ if (trace->is_static) {
+ BT_LOGW("Invalid parameter: trace is already static: "
+ "addr=%p, name=\"%s\"",
+ trace, bt_ctf_trace_get_name(trace));
+ i = -1;
+ goto end;
+ }
+
+ /* Find the next available spot */
+ for (i = 0; i < trace->is_static_listeners->len; i++) {
+ struct bt_ctf_trace_is_static_listener_elem elem =
+ g_array_index(trace->is_static_listeners,
+ struct bt_ctf_trace_is_static_listener_elem, i);
+
+ if (!elem.func) {
+ break;
+ }
+ }
+
+ if (i == trace->is_static_listeners->len) {
+ g_array_append_val(trace->is_static_listeners, new_elem);
+ } else {
+ g_array_insert_val(trace->is_static_listeners, i, new_elem);
+ }
+
+ BT_LOGV("Added \"trace is static\" listener: "
+ "trace-addr=%p, trace-name=\"%s\", func-addr=%p, "
+ "data-addr=%p, listener-id=%d",
+ trace, bt_ctf_trace_get_name(trace), listener, data, i);
+
+end:
+ return i;
+}
+
+int bt_ctf_trace_remove_is_static_listener(
+ struct bt_ctf_trace *trace, int listener_id)
+{
+ int ret = 0;
+ struct bt_ctf_trace_is_static_listener_elem *elem;
+
+ if (!trace) {
+ BT_LOGW_STR("Invalid parameter: trace is NULL.");
+ ret = -1;
+ goto end;
+ }
+
+ if (listener_id < 0) {
+ BT_LOGW("Invalid listener ID: must be zero or positive: "
+ "listener-id=%d", listener_id);
+ ret = -1;
+ goto end;
+ }
+
+ if (listener_id >= trace->is_static_listeners->len) {
+ BT_LOGW("Invalid parameter: no listener with this listener ID: "
+ "addr=%p, name=\"%s\", listener-id=%d",
+ trace, bt_ctf_trace_get_name(trace),
+ listener_id);
+ ret = -1;
+ goto end;
+ }
+
+ elem = &g_array_index(trace->is_static_listeners,
+ struct bt_ctf_trace_is_static_listener_elem,
+ listener_id);
+ if (!elem->func) {
+ BT_LOGW("Invalid parameter: no listener with this listener ID: "
+ "addr=%p, name=\"%s\", listener-id=%d",
+ trace, bt_ctf_trace_get_name(trace),
+ listener_id);
+ ret = -1;
+ goto end;
+ }
+
+ elem->func = NULL;
+ elem->data = NULL;
+ BT_LOGV("Removed \"trace is static\" listener: "
+ "trace-addr=%p, trace-name=\"%s\", "
+ "listener-id=%d", trace, bt_ctf_trace_get_name(trace),
+ listener_id);
+