+/*
+ * Disable UST tracepoint of a map from a UST session.
+ */
+enum lttng_error_code map_event_ust_disable_tracepoint(
+ struct ltt_ust_session *usess,
+ struct ltt_ust_map *umap,
+ uint64_t tracer_token,
+ char *event_name,
+ struct lttng_map_key *key,
+ enum lttng_event_type ev_type,
+ enum lttng_loglevel_type ev_loglevel_type,
+ int ev_loglevel_value,
+ char *filter_expression,
+ struct lttng_bytecode *filter,
+ struct lttng_event_exclusion *exclusion,
+ bool internal_event)
+{
+ int ret;
+ enum lttng_error_code ret_code;
+ struct ltt_ust_event *uevent;
+
+ assert(usess);
+ assert(umap);
+ assert(event_name);
+
+ rcu_read_lock();
+
+ /*
+ * FIXME: frdeso: We need to pass all the parameters to find the right
+ * event.
+ */
+ uevent = trace_ust_find_event(umap->events, tracer_token, event_name, filter,
+ (enum lttng_ust_loglevel_type) ev_loglevel_type,
+ ev_loglevel_value, exclusion, key);
+ assert(uevent);
+
+ if (uevent->enabled == 0) {
+ ret_code = LTTNG_OK;
+ goto end;
+ }
+
+ uevent->enabled = 0;
+ DBG2("Event UST %s disabled in map %s", uevent->attr.name,
+ umap->name);
+
+ if (!usess->active) {
+ ret_code = LTTNG_OK;
+ goto end;
+ }
+
+ ret = ust_app_disable_map_event_glb(usess, umap, uevent);
+ if (ret < 0 && ret != -LTTNG_UST_ERR_EXIST) {
+ ret_code = LTTNG_ERR_UST_DISABLE_FAIL;
+ goto end;
+ }
+
+ ret_code = LTTNG_OK;
+
+end:
+ rcu_read_unlock();
+ return ret_code;
+}
+
+/*
+ * Disable all UST tracepoints for a channel from a UST session.
+ */
+int event_ust_disable_all_tracepoints(struct ltt_ust_session *usess,
+ struct ltt_ust_channel *uchan)
+{
+ int ret, i, size, error = 0;
+ struct lttng_ht_iter iter;
+ struct ltt_ust_event *uevent = NULL;
+ struct lttng_event *events = NULL;
+
+ assert(usess);
+ assert(uchan);
+
+ rcu_read_lock();
+
+ /* Disabling existing events */
+ cds_lfht_for_each_entry(uchan->events->ht, &iter.iter, uevent,
+ node.node) {
+ if (uevent->enabled == 1) {
+ ret = event_ust_disable_tracepoint(usess, uchan,
+ uevent->attr.name);
+ if (ret < 0) {
+ error = LTTNG_ERR_UST_DISABLE_FAIL;
+ continue;
+ }
+ }
+ }
+
+ /* Get all UST available events */
+ size = ust_app_list_events(&events);
+ if (size < 0) {
+ ret = LTTNG_ERR_UST_LIST_FAIL;
+ goto error;
+ }
+
+ for (i = 0; i < size; i++) {
+ ret = event_ust_disable_tracepoint(usess, uchan,
+ events[i].name);
+ if (ret < 0) {
+ /* Continue to disable the rest... */
+ error = LTTNG_ERR_UST_DISABLE_FAIL;
+ continue;
+ }
+ }
+
+ ret = error ? error : LTTNG_OK;
+error:
+ rcu_read_unlock();
+ free(events);
+ return ret;
+}
+
+/*
+ * Disable all UST tracepoints for a map from a UST session.
+ */
+int map_event_ust_disable_all_tracepoints(struct ltt_ust_session *usess,
+ struct ltt_ust_map *umap)
+{
+ int ret, error = 0;
+ struct lttng_ht_iter iter;
+ struct ltt_ust_event *uevent = NULL;
+ struct lttng_event *events = NULL;
+
+ assert(usess);
+ assert(umap);
+
+ rcu_read_lock();
+
+ /* Disabling existing events */
+ cds_lfht_for_each_entry(umap->events->ht, &iter.iter, uevent,
+ node.node) {
+ if (uevent->enabled == 1) {
+ ret = map_event_ust_disable_tracepoint(usess, umap,
+ uevent->attr.token,
+ uevent->attr.name,
+ uevent->key,
+ uevent->attr.instrumentation,
+ (enum lttng_loglevel_type) uevent->attr.loglevel_type,
+ uevent->attr.loglevel,
+ uevent->filter_expression,
+ uevent->filter,
+ uevent->exclusion,
+ false);
+ if (ret < 0) {
+ error = LTTNG_ERR_UST_DISABLE_FAIL;
+ continue;
+ }
+ }
+ }
+
+ /*
+ * FIXME: FRDESO: in the equivalent function
+ * event_ust_disable_all_tracepoints() (above ^) we also iterator over
+ * all lttng_event. Do we need to do this here too?
+ */
+
+ ret = error ? error : LTTNG_OK;
+ rcu_read_unlock();
+ free(events);
+ return ret;
+}
+
+static void agent_enable_all(struct agent *agt)
+{
+ struct agent_event *aevent;
+ struct lttng_ht_iter iter;
+
+ /* Flag every event as enabled. */
+ rcu_read_lock();
+ cds_lfht_for_each_entry (
+ agt->events->ht, &iter.iter, aevent, node.node) {
+ aevent->enabled_count++;
+ }
+ rcu_read_unlock();
+}
+