Rename lttng_condition_event_rule to lttng_condition_on_event
[lttng-tools.git] / src / bin / lttng-sessiond / notification-thread-events.c
index 7fea927d8ba57015e5d5a228383ab0aec4f4de07..aadc1b0a8b207edac646c8aa785ffc3b09f848f5 100644 (file)
@@ -21,6 +21,8 @@
 #include <common/macros.h>
 #include <lttng/condition/condition.h>
 #include <lttng/action/action-internal.h>
+#include <lttng/action/group-internal.h>
+#include <lttng/domain-internal.h>
 #include <lttng/notification/notification-internal.h>
 #include <lttng/condition/condition-internal.h>
 #include <lttng/condition/buffer-usage-internal.h>
@@ -465,7 +467,7 @@ enum lttng_object_type get_condition_binding_object(
        case LTTNG_CONDITION_TYPE_SESSION_ROTATION_ONGOING:
        case LTTNG_CONDITION_TYPE_SESSION_ROTATION_COMPLETED:
                return LTTNG_OBJECT_TYPE_SESSION;
-       case LTTNG_CONDITION_TYPE_EVENT_RULE_HIT:
+       case LTTNG_CONDITION_TYPE_ON_EVENT:
                return LTTNG_OBJECT_TYPE_NONE;
        default:
                return LTTNG_OBJECT_TYPE_UNKNOWN;
@@ -2220,12 +2222,12 @@ bool condition_is_supported(struct lttng_condition *condition)
                is_supported = kernel_supports_ring_buffer_snapshot_sample_positions() == 1;
                break;
        }
-       case LTTNG_CONDITION_TYPE_EVENT_RULE_HIT:
+       case LTTNG_CONDITION_TYPE_ON_EVENT:
        {
                const struct lttng_event_rule *event_rule;
                enum lttng_domain_type domain;
                const enum lttng_condition_status status =
-                               lttng_condition_event_rule_get_rule(
+                               lttng_condition_on_event_get_rule(
                                                condition, &event_rule);
 
                assert(status == LTTNG_CONDITION_STATUS_OK);
@@ -2533,7 +2535,7 @@ int handle_notification_thread_command_register_trigger(
                goto error_free_ht_element;
        }
 
-       if (lttng_condition_get_type(condition) == LTTNG_CONDITION_TYPE_EVENT_RULE_HIT) {
+       if (lttng_condition_get_type(condition) == LTTNG_CONDITION_TYPE_ON_EVENT) {
                trigger_tokens_ht_element = zmalloc(sizeof(*trigger_tokens_ht_element));
                if (!trigger_tokens_ht_element) {
                        /* Fatal error. */
@@ -2828,7 +2830,7 @@ int handle_notification_thread_command_unregister_trigger(
        }
 
        if (lttng_condition_get_type(condition) ==
-                       LTTNG_CONDITION_TYPE_EVENT_RULE_HIT) {
+                       LTTNG_CONDITION_TYPE_ON_EVENT) {
                struct notification_trigger_tokens_ht_element
                                *trigger_tokens_ht_element;
 
@@ -4289,7 +4291,7 @@ struct lttng_event_notifier_notification *recv_one_event_notifier_notification(
                break;
        case LTTNG_DOMAIN_KERNEL:
                token = kernel_notification.token;
-               capture_buffer_size = 0;
+               capture_buffer_size = kernel_notification.capture_buf_size;
                break;
        default:
                abort();
@@ -4350,6 +4352,7 @@ int dispatch_one_event_notifier_notification(struct notification_thread_state *s
        struct notification_client_list *client_list = NULL;
        const char *trigger_name;
        int ret;
+       unsigned int capture_count = 0;
 
        /* Find triggers associated with this token. */
        rcu_read_lock();
@@ -4382,14 +4385,34 @@ int dispatch_one_event_notifier_notification(struct notification_thread_state *s
        trigger_status = lttng_trigger_get_name(element->trigger, &trigger_name);
        assert(trigger_status == LTTNG_TRIGGER_STATUS_OK);
 
-       evaluation = lttng_evaluation_event_rule_create(
-                       trigger_name);
+       if (lttng_condition_on_event_get_capture_descriptor_count(
+                           lttng_trigger_get_const_condition(element->trigger),
+                           &capture_count) != LTTNG_CONDITION_STATUS_OK) {
+               ERR("Failed to get capture count");
+               ret = -1;
+               goto end;
+       }
+
+       if (!notification->capture_buffer && capture_count != 0) {
+               ERR("Expected capture but capture buffer is null");
+               ret = -1;
+               goto end;
+       }
+
+       evaluation = lttng_evaluation_on_event_create(
+                       container_of(lttng_trigger_get_const_condition(
+                                                    element->trigger),
+                                       struct lttng_condition_on_event,
+                                       parent),
+                       trigger_name,
+                       notification->capture_buffer,
+                       notification->capture_buf_size, false);
+
        if (evaluation == NULL) {
                ERR("[notification-thread] Failed to create event rule hit evaluation while creating and enqueuing action executor job");
                ret = -1;
                goto end_unlock;
        }
-
        client_list = get_client_list_from_condition(state,
                        lttng_trigger_get_const_condition(element->trigger));
        executor_status = action_executor_enqueue(state->executor,
@@ -4447,6 +4470,7 @@ next_client:
                pthread_mutex_unlock(&client_list->lock);
                break;
        }
+       case ACTION_EXECUTOR_STATUS_INVALID:
        case ACTION_EXECUTOR_STATUS_ERROR:
                /* Fatal error, shut down everything. */
                ERR("Fatal error encoutered while enqueuing action to the action executor");
@@ -4460,6 +4484,7 @@ next_client:
 end_unlock:
        notification_client_list_put(client_list);
        rcu_read_unlock();
+end:
        return ret;
 }
 
This page took 0.026219 seconds and 4 git commands to generate.