event-notifier: implement `lttng_trigger_needs_tracer_notifier()` function
[lttng-tools.git] / src / common / trigger.c
index 55ab99729c338259d72476e1a8074d12b9e5f43f..ad0d5df1ba9c26644f8ee08bb61245c0d244392b 100644 (file)
@@ -7,10 +7,12 @@
 
 #include <lttng/trigger/trigger-internal.h>
 #include <lttng/condition/condition-internal.h>
-#include <lttng/condition/event-rule.h>
-#include <lttng/condition/event-rule-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 <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;
 
@@ -90,7 +92,6 @@ const struct lttng_condition *lttng_trigger_get_const_condition(
        return trigger ? trigger->condition : NULL;
 }
 
-
 /*
  * 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
@@ -907,9 +908,9 @@ enum lttng_domain_type lttng_trigger_get_underlying_domain_type_restriction(
                /* Apply to any domain. */
                type = LTTNG_DOMAIN_NONE;
                break;
-       case LTTNG_CONDITION_TYPE_EVENT_RULE_HIT:
+       case LTTNG_CONDITION_TYPE_ON_EVENT:
                /* Return the domain of the event rule. */
-               c_status = lttng_condition_event_rule_get_rule(
+               c_status = lttng_condition_on_event_get_rule(
                                trigger->condition, &event_rule);
                assert(c_status == LTTNG_CONDITION_STATUS_OK);
                type = lttng_event_rule_get_domain_type(event_rule);
@@ -947,20 +948,29 @@ enum lttng_error_code lttng_trigger_generate_bytecode(
        }
 
        switch (lttng_condition_get_type(condition)) {
-       case LTTNG_CONDITION_TYPE_EVENT_RULE_HIT:
+       case LTTNG_CONDITION_TYPE_ON_EVENT:
        {
                struct lttng_event_rule *event_rule;
                const enum lttng_condition_status condition_status =
-                               lttng_condition_event_rule_borrow_rule_mutable(
+                               lttng_condition_on_event_borrow_rule_mutable(
                                        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_on_event_generate_capture_descriptor_bytecode(
+                               condition);
+               if (ret != LTTNG_OK) {
+                       goto end;
+               }
+
                ret = LTTNG_OK;
                break;
        }
@@ -971,3 +981,59 @@ 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;
+}
+
+LTTNG_HIDDEN
+bool lttng_trigger_needs_tracer_notifier(const struct lttng_trigger *trigger)
+{
+       bool needs_tracer_notifier = false;
+       const struct lttng_condition *condition =
+                       lttng_trigger_get_const_condition(trigger);
+
+       switch (lttng_condition_get_type(condition)) {
+       case LTTNG_CONDITION_TYPE_ON_EVENT:
+               needs_tracer_notifier = true;
+               goto end;
+       case LTTNG_CONDITION_TYPE_SESSION_CONSUMED_SIZE:
+       case LTTNG_CONDITION_TYPE_BUFFER_USAGE_HIGH:
+       case LTTNG_CONDITION_TYPE_BUFFER_USAGE_LOW:
+       case LTTNG_CONDITION_TYPE_SESSION_ROTATION_ONGOING:
+       case LTTNG_CONDITION_TYPE_SESSION_ROTATION_COMPLETED:
+               goto end;
+       case LTTNG_CONDITION_TYPE_UNKNOWN:
+       default:
+               abort();
+       }
+end:
+       return needs_tracer_notifier;
+}
This page took 0.024248 seconds and 4 git commands to generate.