SoW-2020-0002: Trace Hit Counters
[lttng-tools.git] / src / common / trigger.c
index 71162e79bad63154b070b323ef75560ae89a72aa..9e0333be9e44e517f335fedb389e7fdea04958ee 100644 (file)
@@ -7,13 +7,14 @@
 
 #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/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 <lttng/action/group.h>
 #include <common/credentials.h>
 #include <common/payload.h>
 #include <common/payload-view.h>
@@ -92,7 +93,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
@@ -395,8 +395,13 @@ bool lttng_trigger_is_equal(
        }
 
        /*
-        * Name is not taken into account since it is cosmetic only.
+        * FIXME: frdeso: this is a change of behavior.
+        * See internal tracker issue 1028.
         */
+       if (strcmp(a->name, b->name) != 0) {
+               return false;
+       }
+
        if (!lttng_condition_is_equal(a->condition, b->condition)) {
                return false;
        }
@@ -909,9 +914,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);
@@ -949,11 +954,11 @@ 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);
@@ -966,7 +971,7 @@ enum lttng_error_code lttng_trigger_generate_bytecode(
                }
 
                /* Generate the capture bytecode. */
-               ret = lttng_condition_event_rule_generate_capture_descriptor_bytecode(
+               ret = lttng_condition_on_event_generate_capture_descriptor_bytecode(
                                condition);
                if (ret != LTTNG_OK) {
                        goto end;
@@ -1013,3 +1018,88 @@ end:
        lttng_payload_reset(&copy_buffer);
        return copy;
 }
+
+
+static
+bool action_type_needs_tracer_notifier(enum lttng_action_type action_type)
+{
+       switch (action_type) {
+       case LTTNG_ACTION_TYPE_NOTIFY:
+       case LTTNG_ACTION_TYPE_START_SESSION:
+       case LTTNG_ACTION_TYPE_STOP_SESSION:
+       case LTTNG_ACTION_TYPE_SNAPSHOT_SESSION:
+       case LTTNG_ACTION_TYPE_ROTATE_SESSION:
+               return true;
+       case LTTNG_ACTION_TYPE_INCREMENT_VALUE:
+               return false;
+       case LTTNG_ACTION_TYPE_GROUP:
+       case LTTNG_ACTION_TYPE_UNKNOWN:
+       default:
+               abort();
+       }
+}
+
+static
+bool action_needs_tracer_notifier(const struct lttng_action *action)
+{
+       bool needs_tracer_notifier = false;
+       unsigned int i, count;
+       enum lttng_action_status action_status;
+       enum lttng_action_type action_type;
+
+       assert(action);
+       /* If there is only one action. Check if it needs a tracer notifier. */
+       action_type = lttng_action_get_type(action);
+       if (action_type != LTTNG_ACTION_TYPE_GROUP) {
+               needs_tracer_notifier = action_type_needs_tracer_notifier(
+                               action_type);
+               goto end;
+       }
+
+       /*
+        * Iterate over all the actions of the action group and check if any of
+        * them needs a tracer notifier.
+        */
+       action_status = lttng_action_group_get_count(action, &count);
+       assert(action_status == LTTNG_ACTION_STATUS_OK);
+       for (i = 0; i < count; i++) {
+               const struct lttng_action *inner_action =
+                               lttng_action_group_get_at_index(action, i);
+
+               action_type = lttng_action_get_type(inner_action);
+               if (action_type_needs_tracer_notifier(action_type)) {
+                       needs_tracer_notifier = true;
+                       goto end;
+               }
+       }
+
+end:
+       return needs_tracer_notifier;
+}
+
+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);
+       const struct lttng_action *action =
+                       lttng_trigger_get_const_action(trigger);
+
+       switch (lttng_condition_get_type(condition)) {
+       case LTTNG_CONDITION_TYPE_ON_EVENT:
+               needs_tracer_notifier = action_needs_tracer_notifier(action);
+               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.027522 seconds and 5 git commands to generate.