Generate capture bytecode on trigger reception
[lttng-tools.git] / src / common / trigger.c
index f47f76d5529a732a8f6e263d32a373d622ac1b92..71162e79bad63154b070b323ef75560ae89a72aa 100644 (file)
@@ -7,10 +7,12 @@
 
 #include <lttng/trigger/trigger-internal.h>
 #include <lttng/condition/condition-internal.h>
+#include <lttng/condition/event-rule-internal.h>
 #include <lttng/condition/event-rule.h>
 #include <lttng/condition/event-rule-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 <common/credentials.h>
 #include <common/payload.h>
@@ -23,7 +25,7 @@
 #include <inttypes.h>
 
 LTTNG_HIDDEN
-bool lttng_trigger_validate(struct lttng_trigger *trigger)
+bool lttng_trigger_validate(const struct lttng_trigger *trigger)
 {
        bool valid;
 
@@ -84,11 +86,10 @@ struct lttng_condition *lttng_trigger_get_condition(
        return trigger ? trigger->condition : NULL;
 }
 
-LTTNG_HIDDEN
 const struct lttng_condition *lttng_trigger_get_const_condition(
                const struct lttng_trigger *trigger)
 {
-       return trigger->condition;
+       return trigger ? trigger->condition : NULL;
 }
 
 
@@ -103,11 +104,10 @@ struct lttng_action *lttng_trigger_get_action(
        return trigger ? trigger->action : NULL;
 }
 
-LTTNG_HIDDEN
 const struct lttng_action *lttng_trigger_get_const_action(
                const struct lttng_trigger *trigger)
 {
-       return trigger->action;
+       return trigger ? trigger->action : NULL;
 }
 
 static void trigger_destroy_ref(struct urcu_ref *ref)
@@ -957,12 +957,21 @@ enum lttng_error_code lttng_trigger_generate_bytecode(
                                        condition, &event_rule);
 
                assert(condition_status == LTTNG_CONDITION_STATUS_OK);
+
+               /* Generate the filter bytecode. */
                ret = lttng_event_rule_generate_filter_bytecode(
                                event_rule, creds);
                if (ret != LTTNG_OK) {
                        goto end;
                }
 
+               /* Generate the capture bytecode. */
+               ret = lttng_condition_event_rule_generate_capture_descriptor_bytecode(
+                               condition);
+               if (ret != LTTNG_OK) {
+                       goto end;
+               }
+
                ret = LTTNG_OK;
                break;
        }
@@ -973,3 +982,34 @@ enum lttng_error_code lttng_trigger_generate_bytecode(
 end:
        return ret;
 }
+
+LTTNG_HIDDEN
+struct lttng_trigger *lttng_trigger_copy(const struct lttng_trigger *trigger)
+{
+       int ret;
+       struct lttng_payload copy_buffer;
+       struct lttng_trigger *copy = NULL;
+
+       lttng_payload_init(&copy_buffer);
+
+       ret = lttng_trigger_serialize(trigger, &copy_buffer);
+       if (ret < 0) {
+               goto end;
+       }
+
+       {
+               struct lttng_payload_view view =
+                               lttng_payload_view_from_payload(
+                                               &copy_buffer, 0, -1);
+               ret = lttng_trigger_create_from_payload(
+                               &view, &copy);
+               if (ret < 0) {
+                       copy = NULL;
+                       goto end;
+               }
+       }
+
+end:
+       lttng_payload_reset(&copy_buffer);
+       return copy;
+}
This page took 0.024282 seconds and 4 git commands to generate.