+ }
+end:
+ return needs_tracer_notifier;
+}
+
+void lttng_trigger_set_as_registered(struct lttng_trigger *trigger)
+{
+ pthread_mutex_lock(&trigger->lock);
+ trigger->registered = true;
+ pthread_mutex_unlock(&trigger->lock);
+}
+
+void lttng_trigger_set_as_unregistered(struct lttng_trigger *trigger)
+{
+ pthread_mutex_lock(&trigger->lock);
+ trigger->registered = false;
+ pthread_mutex_unlock(&trigger->lock);
+}
+
+/*
+ * The trigger must be locked before calling lttng_trigger_registered.
+ * The lock is necessary since a trigger can be unregistered at anytime.
+ * Manipulations requiring that the trigger be registered must always acquire
+ * the trigger lock for the duration of the manipulation using
+ * `lttng_trigger_lock` and `lttng_trigger_unlock`.
+ */
+bool lttng_trigger_is_registered(struct lttng_trigger *trigger)
+{
+ ASSERT_LOCKED(trigger->lock);
+ return trigger->registered;
+}
+
+void lttng_trigger_lock(struct lttng_trigger *trigger)
+{
+ pthread_mutex_lock(&trigger->lock);
+}
+
+void lttng_trigger_unlock(struct lttng_trigger *trigger)
+{
+ pthread_mutex_unlock(&trigger->lock);
+}
+
+enum lttng_error_code lttng_trigger_mi_serialize(const struct lttng_trigger *trigger,
+ struct mi_writer *writer,
+ const struct mi_lttng_error_query_callbacks
+ *error_query_callbacks)
+{
+ int ret;
+ enum lttng_error_code ret_code;
+ enum lttng_trigger_status trigger_status;
+ const struct lttng_condition *condition = NULL;
+ const struct lttng_action *action = NULL;
+ struct lttng_dynamic_array action_path_indexes;
+ uid_t owner_uid;
+
+ LTTNG_ASSERT(trigger);
+ LTTNG_ASSERT(writer);
+
+ lttng_dynamic_array_init(&action_path_indexes, sizeof(uint64_t), NULL);
+
+ /* Open trigger element. */
+ ret = mi_lttng_writer_open_element(writer, mi_lttng_element_trigger);
+ if (ret) {
+ goto mi_error;
+ }
+
+ trigger_status = lttng_trigger_get_owner_uid(trigger, &owner_uid);
+ LTTNG_ASSERT(trigger_status == LTTNG_TRIGGER_STATUS_OK);
+
+ /* Name. */
+ ret = mi_lttng_writer_write_element_string(
+ writer, config_element_name, trigger->name);
+ if (ret) {
+ goto mi_error;
+ }
+
+ /* Owner uid. */
+ ret = mi_lttng_writer_write_element_signed_int(writer,
+ mi_lttng_element_trigger_owner_uid,
+ (int64_t) owner_uid);
+ if (ret) {
+ goto mi_error;
+ }