Fix: event probes attached before event enabled
[lttng-ust.git] / liblttng-ust / lttng-filter.c
index 0508349f39773534e8821b116a66f4c595806005..bbc212892342f988041b025577de506eeaf0e029 100644 (file)
  */
 
 #define _LGPL_SOURCE
+#include <stddef.h>
+#include <stdint.h>
+
 #include <urcu/rculist.h>
+
 #include "lttng-filter.h"
 
 static const char *opnames[] = {
@@ -39,8 +43,8 @@ static const char *opnames[] = {
        [ FILTER_OP_MOD ] = "MOD",
        [ FILTER_OP_PLUS ] = "PLUS",
        [ FILTER_OP_MINUS ] = "MINUS",
-       [ FILTER_OP_RSHIFT ] = "RSHIFT",
-       [ FILTER_OP_LSHIFT ] = "LSHIFT",
+       [ FILTER_OP_BIT_RSHIFT ] = "BIT_RSHIFT",
+       [ FILTER_OP_BIT_LSHIFT ] = "BIT_LSHIFT",
        [ FILTER_OP_BIT_AND ] = "BIT_AND",
        [ FILTER_OP_BIT_OR ] = "BIT_OR",
        [ FILTER_OP_BIT_XOR ] = "BIT_XOR",
@@ -168,6 +172,10 @@ static const char *opnames[] = {
        [ FILTER_OP_LOAD_FIELD_STRING ] = "LOAD_FIELD_STRING",
        [ FILTER_OP_LOAD_FIELD_SEQUENCE ] = "LOAD_FIELD_SEQUENCE",
        [ FILTER_OP_LOAD_FIELD_DOUBLE ] = "LOAD_FIELD_DOUBLE",
+
+       [ FILTER_OP_UNARY_BIT_NOT ] = "UNARY_BIT_NOT",
+
+       [ FILTER_OP_RETURN_S64 ] = "RETURN_S64",
 };
 
 const char *print_op(enum filter_op op)
@@ -203,6 +211,9 @@ int apply_field_reloc(struct lttng_event *event,
                return -EINVAL;
        nr_fields = desc->nr_fields;
        for (i = 0; i < nr_fields; i++) {
+               if (fields[i].u.ext.nofilter) {
+                       continue;
+               }
                if (!strcmp(fields[i].name, field_name)) {
                        field = &fields[i];
                        break;
@@ -211,10 +222,13 @@ int apply_field_reloc(struct lttng_event *event,
                switch (fields[i].type.atype) {
                case atype_integer:
                case atype_enum:
+               case atype_enum_nestable:
                        field_offset += sizeof(int64_t);
                        break;
                case atype_array:
+               case atype_array_nestable:
                case atype_sequence:
+               case atype_sequence_nestable:
                        field_offset += sizeof(unsigned long);
                        field_offset += sizeof(void *);
                        break;
@@ -247,10 +261,13 @@ int apply_field_reloc(struct lttng_event *event,
                switch (field->type.atype) {
                case atype_integer:
                case atype_enum:
+               case atype_enum_nestable:
                        op->op = FILTER_OP_LOAD_FIELD_REF_S64;
                        break;
                case atype_array:
+               case atype_array_nestable:
                case atype_sequence:
+               case atype_sequence_nestable:
                        op->op = FILTER_OP_LOAD_FIELD_REF_SEQUENCE;
                        break;
                case atype_string:
@@ -322,12 +339,15 @@ int apply_context_reloc(struct lttng_event *event,
                switch (ctx_field->event_field.type.atype) {
                case atype_integer:
                case atype_enum:
+               case atype_enum_nestable:
                        op->op = FILTER_OP_GET_CONTEXT_REF_S64;
                        break;
                        /* Sequence and array supported as string */
                case atype_string:
                case atype_array:
+               case atype_array_nestable:
                case atype_sequence:
+               case atype_sequence_nestable:
                        op->op = FILTER_OP_GET_CONTEXT_REF_STRING;
                        break;
                case atype_float:
@@ -430,7 +450,6 @@ int _lttng_filter_event_link_bytecode(struct lttng_event *event,
        }
        runtime->p.bc = filter_bytecode;
        runtime->p.session = event->chan->session;
-       runtime->p.event = event;
        runtime->len = filter_bytecode->bc.reloc_offset;
        /* copy original bytecode */
        memcpy(runtime->code, filter_bytecode->bc.data, runtime->len);
@@ -517,11 +536,12 @@ void lttng_enabler_event_link_bytecode(struct lttng_event *event,
 
                /*
                 * Insert at specified priority (seqnum) in increasing
-                * order.
+                * order. If there already is a bytecode of the same priority,
+                * insert the new bytecode right after it.
                 */
                cds_list_for_each_entry_reverse(runtime,
                                &event->bytecode_runtime_head, node) {
-                       if (runtime->bc->bc.seqnum < bc->bc.seqnum) {
+                       if (runtime->bc->bc.seqnum <= bc->bc.seqnum) {
                                /* insert here */
                                insert_loc = &runtime->node;
                                goto add_within;
@@ -549,16 +569,6 @@ int lttng_filter_enabler_attach_bytecode(struct lttng_enabler *enabler,
        return 0;
 }
 
-void lttng_free_enabler_filter_bytecode(struct lttng_enabler *enabler)
-{
-       struct lttng_ust_filter_bytecode_node *filter_bytecode, *tmp;
-
-       cds_list_for_each_entry_safe(filter_bytecode, tmp,
-                       &enabler->filter_bytecode_head, node) {
-               free(filter_bytecode);
-       }
-}
-
 void lttng_free_event_filter_runtime(struct lttng_event *event)
 {
        struct bytecode_runtime *runtime, *tmp;
This page took 0.026086 seconds and 4 git commands to generate.