on-event: add error counter fields to condition
[lttng-tools.git] / src / common / conditions / on-event.c
index a10df868ac0d20d83ef1497ffa188e103ef4cf54..31d6d756b0fb556d02270d6075d4a6aaa41f03f7 100644 (file)
@@ -27,6 +27,8 @@
        (lttng_condition_get_type(condition) == \
                        LTTNG_CONDITION_TYPE_ON_EVENT)
 
+typedef LTTNG_OPTIONAL(uint64_t) optional_uint64;
+
 static bool is_on_event_evaluation(const struct lttng_evaluation *evaluation)
 {
        enum lttng_condition_type type = lttng_evaluation_get_type(evaluation);
@@ -284,6 +286,7 @@ static int lttng_condition_on_event_serialize(
        enum lttng_condition_status status;
        /* Used for iteration and communication (size matters). */
        uint32_t i, capture_descr_count;
+       LTTNG_OPTIONAL_COMM(typeof(on_event_condition->error_count.value)) error_count_comm;
 
        if (!condition || !IS_ON_EVENT_CONDITION(condition)) {
                ret = -1;
@@ -300,6 +303,30 @@ static int lttng_condition_on_event_serialize(
                goto end;
        }
 
+       error_count_comm = (typeof(error_count_comm)) {
+               .is_set = on_event_condition->error_count.is_set,
+               .value = on_event_condition->error_count.value,
+       };
+
+       {
+               char error_count_value_str[MAX_INT_DEC_LEN(on_event_condition->error_count.value)];
+               const int fmt_ret = snprintf(error_count_value_str,
+                               sizeof(error_count_value_str), "%" PRIu64,
+                               on_event_condition->error_count.value);
+
+               assert(fmt_ret > 0);
+               DBG("Serializing event rule condition's error count: value = %s",
+                               on_event_condition->error_count.is_set ?
+                                               error_count_value_str :
+                                               "(unset)");
+       }
+
+       ret = lttng_dynamic_buffer_append(&payload->buffer, &error_count_comm,
+                       sizeof(error_count_comm));
+       if (ret) {
+               goto end;
+       }
+
        status = lttng_condition_on_event_get_capture_descriptor_count(
                        condition, &capture_descr_count);
        if (status != LTTNG_CONDITION_STATUS_OK) {
@@ -506,6 +533,112 @@ end:
        return ret;
 }
 
+static
+int optional_uint_from_buffer(
+               const struct lttng_buffer_view *view,
+               size_t inner_value_size,
+               size_t *offset,
+               optional_uint64 *value)
+{
+       int ret;
+
+       /*
+        * Those cases are identical except for the optional's inner type width.
+        */
+       switch (inner_value_size) {
+       case sizeof(uint8_t):
+       {
+               LTTNG_OPTIONAL_COMM(uint8_t) *value_comm;
+               const struct lttng_buffer_view optional_uint_view =
+                               lttng_buffer_view_from_view(view, *offset,
+                                                           sizeof(*value_comm));
+
+               if (!lttng_buffer_view_is_valid(&optional_uint_view)) {
+                       ret = -1;
+                       goto end;
+               }
+
+               value_comm = (typeof(value_comm)) optional_uint_view.data;
+               *value = (typeof(*value)) {
+                       .is_set = value_comm->is_set,
+                       .value = (uint64_t) value_comm->value,
+               };
+
+               *offset += sizeof(*value_comm);
+               break;
+       }
+       case sizeof(uint16_t):
+       {
+               LTTNG_OPTIONAL_COMM(uint16_t) *value_comm;
+               const struct lttng_buffer_view optional_uint_view =
+                               lttng_buffer_view_from_view(view, *offset,
+                                               sizeof(*value_comm));
+
+               if (!lttng_buffer_view_is_valid(&optional_uint_view)) {
+                       ret = -1;
+                       goto end;
+               }
+
+               value_comm = (typeof(value_comm)) optional_uint_view.data;
+               *value = (typeof(*value)) {
+                       .is_set = value_comm->is_set,
+                       .value = (uint64_t) value_comm->value,
+               };
+
+               *offset += sizeof(*value_comm);
+               break;
+       }
+       case sizeof(uint32_t):
+       {
+               LTTNG_OPTIONAL_COMM(uint32_t) *value_comm;
+               const struct lttng_buffer_view optional_uint_view =
+                               lttng_buffer_view_from_view(view, *offset,
+                                               sizeof(*value_comm));
+
+               if (!lttng_buffer_view_is_valid(&optional_uint_view)) {
+                       ret = -1;
+                       goto end;
+               }
+
+               value_comm = (typeof(value_comm)) optional_uint_view.data;
+               *value = (typeof(*value)) {
+                       .is_set = value_comm->is_set,
+                       .value = (uint64_t) value_comm->value,
+               };
+
+               *offset += sizeof(*value_comm);
+               break;
+       }
+       case sizeof(uint64_t):
+       {
+               LTTNG_OPTIONAL_COMM(uint64_t) *value_comm;
+               const struct lttng_buffer_view optional_uint_view =
+                               lttng_buffer_view_from_view(view, *offset,
+                                               sizeof(*value_comm));
+
+               if (!lttng_buffer_view_is_valid(&optional_uint_view)) {
+                       ret = -1;
+                       goto end;
+               }
+
+               value_comm = (typeof(value_comm)) optional_uint_view.data;
+               *value = (typeof(*value)) {
+                       .is_set = value_comm->is_set,
+                       .value = (uint64_t) value_comm->value,
+               };
+
+               *offset += sizeof(*value_comm);
+               break;
+       }
+       default:
+               abort();
+       }
+
+       ret = 0;
+end:
+       return ret;
+}
+
 static
 const char *str_from_buffer(const struct lttng_buffer_view *view,
                size_t *offset)
@@ -628,10 +761,12 @@ ssize_t lttng_condition_on_event_create_from_payload(
                struct lttng_payload_view *view,
                struct lttng_condition **_condition)
 {
+       int optional_ret;
        ssize_t consumed_length;
        size_t offset = 0;
        ssize_t event_rule_length;
        uint32_t i, capture_descr_count;
+       optional_uint64 error_count;
        struct lttng_condition *condition = NULL;
        struct lttng_event_rule *event_rule = NULL;
 
@@ -652,15 +787,29 @@ ssize_t lttng_condition_on_event_create_from_payload(
                goto error;
        }
 
+       offset += event_rule_length;
+
+       /* Error count. */
+       optional_ret = optional_uint_from_buffer(&view->buffer,
+                       sizeof(error_count.value), &offset,
+                       &error_count);
+       if (optional_ret) {
+               goto error;
+       }
+
        /* Create condition (no capture descriptors yet) at this point */
        condition = lttng_condition_on_event_create(event_rule);
        if (!condition) {
                goto error;
        }
 
+       if (error_count.is_set) {
+               lttng_condition_on_event_set_error_count(
+                               condition, error_count.value);
+       }
+
        /* Capture descriptor count. */
        assert(event_rule_length >= 0);
-       offset += (size_t) event_rule_length;
        capture_descr_count = uint_from_buffer(&view->buffer, sizeof(uint32_t), &offset);
        if (capture_descr_count == UINT32_C(-1)) {
                goto error;
@@ -738,6 +887,49 @@ enum lttng_condition_status lttng_condition_on_event_get_rule(
        return status;
 }
 
+LTTNG_HIDDEN
+void lttng_condition_on_event_set_error_counter_index(
+               struct lttng_condition *condition, uint64_t error_counter_index)
+{
+       struct lttng_condition_on_event *on_event_cond =
+                       container_of(condition,
+                               struct lttng_condition_on_event, parent);
+
+       LTTNG_OPTIONAL_SET(&on_event_cond->error_counter_index, error_counter_index);
+}
+
+LTTNG_HIDDEN
+uint64_t lttng_condition_on_event_get_error_counter_index(
+               const struct lttng_condition *condition)
+{
+       const struct lttng_condition_on_event *on_event_cond =
+                       container_of(condition,
+                               const struct lttng_condition_on_event, parent);
+
+       return LTTNG_OPTIONAL_GET(on_event_cond->error_counter_index);
+}
+
+LTTNG_HIDDEN
+void lttng_condition_on_event_set_error_count(struct lttng_condition *condition,
+               uint64_t error_count)
+{
+       struct lttng_condition_on_event *on_event_cond =
+                       container_of(condition,
+                               struct lttng_condition_on_event, parent);
+
+       LTTNG_OPTIONAL_SET(&on_event_cond->error_count, error_count);
+}
+
+uint64_t lttng_condition_on_event_get_error_count(
+               const struct lttng_condition *condition)
+{
+       const struct lttng_condition_on_event *on_event_cond =
+                       container_of(condition,
+                               const struct lttng_condition_on_event, parent);
+
+       return LTTNG_OPTIONAL_GET(on_event_cond->error_count);
+}
+
 enum lttng_condition_status
 lttng_condition_on_event_append_capture_descriptor(
                struct lttng_condition *condition,
@@ -745,7 +937,7 @@ lttng_condition_on_event_append_capture_descriptor(
 {
        int ret;
        enum lttng_condition_status status = LTTNG_CONDITION_STATUS_OK;
-       struct lttng_condition_on_event *event_rule_cond =
+       struct lttng_condition_on_event *on_event_cond =
                        container_of(condition,
                                struct lttng_condition_on_event, parent);
        struct lttng_capture_descriptor *descriptor = NULL;
@@ -791,7 +983,7 @@ lttng_condition_on_event_append_capture_descriptor(
        descriptor->bytecode = NULL;
 
        ret = lttng_dynamic_pointer_array_add_pointer(
-                       &event_rule_cond->capture_descriptors, descriptor);
+                       &on_event_cond->capture_descriptors, descriptor);
        if (ret) {
                status = LTTNG_CONDITION_STATUS_ERROR;
                goto end;
@@ -1380,23 +1572,25 @@ error:
        return evaluation;
 }
 
-enum lttng_evaluation_status lttng_evaluation_on_event_get_captured_values(
+enum lttng_evaluation_on_event_status
+lttng_evaluation_on_event_get_captured_values(
                const struct lttng_evaluation *evaluation,
                const struct lttng_event_field_value **field_val)
 {
        struct lttng_evaluation_on_event *hit;
-       enum lttng_evaluation_status status = LTTNG_EVALUATION_STATUS_OK;
+       enum lttng_evaluation_on_event_status status =
+                       LTTNG_EVALUATION_ON_EVENT_STATUS_OK;
 
        if (!evaluation || !is_on_event_evaluation(evaluation) ||
                        !field_val) {
-               status = LTTNG_EVALUATION_STATUS_INVALID;
+               status = LTTNG_EVALUATION_ON_EVENT_STATUS_INVALID;
                goto end;
        }
 
        hit = container_of(evaluation, struct lttng_evaluation_on_event,
                        parent);
        if (!hit->captured_values) {
-               status = LTTNG_EVALUATION_STATUS_INVALID;
+               status = LTTNG_EVALUATION_ON_EVENT_STATUS_NONE;
                goto end;
        }
 
@@ -1477,7 +1671,7 @@ const struct lttng_bytecode *
 lttng_condition_on_event_get_capture_bytecode_at_index(
                const struct lttng_condition *condition, unsigned int index)
 {
-       const struct lttng_condition_on_event *event_rule_cond =
+       const struct lttng_condition_on_event *on_event_cond =
                        container_of(condition,
                                const struct lttng_condition_on_event,
                                parent);
@@ -1501,7 +1695,7 @@ lttng_condition_on_event_get_capture_bytecode_at_index(
        }
 
        desc = lttng_dynamic_pointer_array_get_pointer(
-                       &event_rule_cond->capture_descriptors, index);
+                       &on_event_cond->capture_descriptors, index);
        if (desc == NULL) {
                goto end;
        }
This page took 0.026966 seconds and 4 git commands to generate.