trigger: use condition and action ref counting to ease internal objects management
[lttng-tools.git] / src / common / trigger.c
index 5ff478a46f220c7815dd0f4db48343d7577e7690..2ccf0073589a64d3f5fb8fc98bb5daea3b5bb848 100644 (file)
@@ -8,9 +8,11 @@
 #include <lttng/trigger/trigger-internal.h>
 #include <lttng/condition/condition-internal.h>
 #include <lttng/action/action-internal.h>
+#include <common/credentials.h>
 #include <common/payload.h>
 #include <common/payload-view.h>
 #include <common/error.h>
+#include <common/optional.h>
 #include <assert.h>
 
 LTTNG_HIDDEN
@@ -44,12 +46,21 @@ struct lttng_trigger *lttng_trigger_create(
                goto end;
        }
 
+       lttng_condition_get(condition);
        trigger->condition = condition;
+
+       lttng_action_get(action);
        trigger->action = action;
+
 end:
        return trigger;
 }
 
+/*
+ * Note: the lack of reference counting 'get' on the condition object is normal.
+ * This API was exposed as such in 2.11. The client is not expected to call
+ * lttng_condition_destroy on the returned object.
+ */
 struct lttng_condition *lttng_trigger_get_condition(
                struct lttng_trigger *trigger)
 {
@@ -63,6 +74,12 @@ const struct lttng_condition *lttng_trigger_get_const_condition(
        return trigger->condition;
 }
 
+
+/*
+ * Note: the lack of reference counting 'get' on the action object is normal.
+ * This API was exposed as such in 2.11. The client is not expected to call
+ * lttng_action_destroy on the returned object.
+ */
 struct lttng_action *lttng_trigger_get_action(
                struct lttng_trigger *trigger)
 {
@@ -78,10 +95,21 @@ const struct lttng_action *lttng_trigger_get_const_action(
 
 void lttng_trigger_destroy(struct lttng_trigger *trigger)
 {
+       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);
+
+       /* Release ownership. */
+       lttng_action_put(action);
+       lttng_condition_put(condition);
+
        free(trigger);
 }
 
@@ -146,12 +174,22 @@ ssize_t lttng_trigger_create_from_payload(
                goto error;
        }
 
+       /*
+        * The trigger object owns references to the action and condition
+        * objects.
+        */
+       lttng_condition_put(condition);
+       condition = NULL;
+
+       lttng_action_put(action);
+       action = NULL;
+
        ret = offset;
-end:
-       return ret;
+
 error:
        lttng_condition_destroy(condition);
        lttng_action_destroy(action);
+end:
        return ret;
 }
 
@@ -192,3 +230,19 @@ int lttng_trigger_serialize(struct lttng_trigger *trigger,
 end:
        return ret;
 }
+
+LTTNG_HIDDEN
+const struct lttng_credentials *lttng_trigger_get_credentials(
+               const struct lttng_trigger *trigger)
+{
+       return LTTNG_OPTIONAL_GET_PTR(trigger->creds);
+}
+
+LTTNG_HIDDEN
+void lttng_trigger_set_credentials(
+               struct lttng_trigger *trigger,
+               const struct lttng_credentials *creds)
+{
+       assert(creds);
+       LTTNG_OPTIONAL_SET(&trigger->creds, *creds);
+}
This page took 0.026311 seconds and 5 git commands to generate.