trigger: introduce refcounting
[lttng-tools.git] / src / common / trigger.c
index 2ccf0073589a64d3f5fb8fc98bb5daea3b5bb848..2ef77b2360a2bf8ab1ea80cdf513da2b9d46ce2b 100644 (file)
@@ -46,6 +46,8 @@ struct lttng_trigger *lttng_trigger_create(
                goto end;
        }
 
+       urcu_ref_init(&trigger->ref);
+
        lttng_condition_get(condition);
        trigger->condition = condition;
 
@@ -93,16 +95,14 @@ const struct lttng_action *lttng_trigger_get_const_action(
        return trigger->action;
 }
 
-void lttng_trigger_destroy(struct lttng_trigger *trigger)
+static void trigger_destroy_ref(struct urcu_ref *ref)
 {
+       struct lttng_trigger *trigger =
+                       container_of(ref, struct lttng_trigger, ref);
        struct lttng_action *action = lttng_trigger_get_action(trigger);
        struct lttng_condition *condition =
                        lttng_trigger_get_condition(trigger);
 
-       if (!trigger) {
-               return;
-       }
-
        assert(action);
        assert(condition);
 
@@ -113,6 +113,11 @@ void lttng_trigger_destroy(struct lttng_trigger *trigger)
        free(trigger);
 }
 
+void lttng_trigger_destroy(struct lttng_trigger *trigger)
+{
+       lttng_trigger_put(trigger);
+}
+
 LTTNG_HIDDEN
 ssize_t lttng_trigger_create_from_payload(
                struct lttng_payload_view *src_view,
@@ -231,6 +236,22 @@ end:
        return ret;
 }
 
+LTTNG_HIDDEN
+void lttng_trigger_get(struct lttng_trigger *trigger)
+{
+       urcu_ref_get(&trigger->ref);
+}
+
+LTTNG_HIDDEN
+void lttng_trigger_put(struct lttng_trigger *trigger)
+{
+       if (!trigger) {
+               return;
+       }
+
+       urcu_ref_put(&trigger->ref , trigger_destroy_ref);
+}
+
 LTTNG_HIDDEN
 const struct lttng_credentials *lttng_trigger_get_credentials(
                const struct lttng_trigger *trigger)
This page took 0.023619 seconds and 4 git commands to generate.