Support capture for kernel tracer
[lttng-tools.git] / src / bin / lttng-sessiond / notification-thread-events.c
index 7fea927d8ba57015e5d5a228383ab0aec4f4de07..413f1848b44f1fa7986db6aa023661c9f06c305c 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>
@@ -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);
 
+       if (lttng_condition_event_rule_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_event_rule_create(
-                       trigger_name);
+                       container_of(lttng_trigger_get_const_condition(
+                                                    element->trigger),
+                                       struct lttng_condition_event_rule,
+                                       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.024321 seconds and 4 git commands to generate.