trigger: introduce refcounting
authorJonathan Rajotte <jonathan.rajotte-julien@efficios.com>
Fri, 7 Feb 2020 22:40:46 +0000 (17:40 -0500)
committerJérémie Galarneau <jeremie.galarneau@efficios.com>
Tue, 11 Aug 2020 19:17:32 +0000 (15:17 -0400)
Will be used for listing and much more use.

Signed-off-by: Jonathan Rajotte <jonathan.rajotte-julien@efficios.com>
Signed-off-by: Jérémie Galarneau <jeremie.galarneau@efficios.com>
Change-Id: Ic9ee8753257fcbe15fc1321b18582628328c0154

include/lttng/trigger/trigger-internal.h
src/common/trigger.c

index d857ff78e20ee54bdc9d98cc10854f371391ef06..4b031137c6473153fc005321bb4a226c4c51fb3f 100644 (file)
 #include <stdint.h>
 #include <stdbool.h>
 #include <sys/types.h>
+#include <urcu/ref.h>
 
 struct lttng_payload;
 struct lttng_payload_view;
 
 struct lttng_trigger {
+       /* Reference counting is only exposed to internal users. */
+       struct urcu_ref ref;
+
        struct lttng_condition *condition;
        struct lttng_action *action;
        LTTNG_OPTIONAL(struct lttng_credentials) creds;
@@ -51,6 +55,12 @@ const struct lttng_action *lttng_trigger_get_const_action(
 LTTNG_HIDDEN
 bool lttng_trigger_validate(struct lttng_trigger *trigger);
 
+LTTNG_HIDDEN
+void lttng_trigger_get(struct lttng_trigger *trigger);
+
+LTTNG_HIDDEN
+void lttng_trigger_put(struct lttng_trigger *trigger);
+
 LTTNG_HIDDEN
 const struct lttng_credentials *lttng_trigger_get_credentials(
                const struct lttng_trigger *trigger);
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.036821 seconds and 4 git commands to generate.