trigger: keep state of if a trigger is currently registered
[lttng-tools.git] / src / common / trigger.c
index 125c871eaf80c98d63579713866d88339de4f760..ec96fc80b7d804249c8c4f1f395d4a693080fd1e 100644 (file)
@@ -5,24 +5,24 @@
  *
  */
 
-#include <lttng/trigger/trigger-internal.h>
-#include <lttng/condition/condition-internal.h>
-#include <lttng/condition/on-event-internal.h>
-#include <lttng/condition/on-event.h>
-#include <lttng/condition/on-event-internal.h>
-#include <lttng/condition/buffer-usage.h>
-#include <lttng/event-rule/event-rule-internal.h>
-#include <lttng/event-expr-internal.h>
-#include <lttng/action/action-internal.h>
+#include <assert.h>
 #include <common/credentials.h>
-#include <common/payload.h>
-#include <common/payload-view.h>
-#include <lttng/domain.h>
-#include <common/error.h>
 #include <common/dynamic-array.h>
+#include <common/error.h>
 #include <common/optional.h>
-#include <assert.h>
+#include <common/payload-view.h>
+#include <common/payload.h>
 #include <inttypes.h>
+#include <lttng/action/action-internal.h>
+#include <lttng/condition/buffer-usage.h>
+#include <lttng/condition/condition-internal.h>
+#include <lttng/condition/on-event-internal.h>
+#include <lttng/condition/on-event.h>
+#include <lttng/domain.h>
+#include <lttng/event-expr-internal.h>
+#include <lttng/event-rule/event-rule-internal.h>
+#include <lttng/trigger/trigger-internal.h>
+#include <pthread.h>
 
 LTTNG_HIDDEN
 bool lttng_trigger_validate(const struct lttng_trigger *trigger)
@@ -68,6 +68,9 @@ struct lttng_trigger *lttng_trigger_create(
        lttng_action_get(action);
        trigger->action = action;
 
+       pthread_mutex_init(&trigger->lock, NULL);
+       trigger->registered = false;
+
 end:
        return trigger;
 }
@@ -121,6 +124,8 @@ static void trigger_destroy_ref(struct urcu_ref *ref)
        lttng_action_put(action);
        lttng_condition_put(condition);
 
+       pthread_mutex_destroy(&trigger->lock);
+
        free(trigger->name);
        free(trigger);
 }
@@ -895,3 +900,45 @@ bool lttng_trigger_needs_tracer_notifier(const struct lttng_trigger *trigger)
 end:
        return needs_tracer_notifier;
 }
+
+LTTNG_HIDDEN
+void lttng_trigger_set_as_registered(struct lttng_trigger *trigger)
+{
+       pthread_mutex_lock(&trigger->lock);
+       trigger->registered = true;
+       pthread_mutex_unlock(&trigger->lock);
+}
+
+LTTNG_HIDDEN
+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`.
+ */
+LTTNG_HIDDEN
+bool lttng_trigger_is_registered(struct lttng_trigger *trigger)
+{
+       ASSERT_LOCKED(trigger->lock);
+       return trigger->registered;
+}
+
+LTTNG_HIDDEN
+void lttng_trigger_lock(struct lttng_trigger *trigger)
+{
+       pthread_mutex_lock(&trigger->lock);
+}
+
+LTTNG_HIDDEN
+void lttng_trigger_unlock(struct lttng_trigger *trigger)
+{
+       pthread_mutex_unlock(&trigger->lock);
+}
This page took 0.032641 seconds and 4 git commands to generate.