Implement capturing payload on event notifier
[lttng-modules.git] / src / lttng-bytecode.c
index 10093a7a40aacc9923d2aae24317ef6a72aac1f9..5702929bd4a44fe9c95dd49ef2f324452c47e0ec 100644 (file)
@@ -395,7 +395,7 @@ int bytecode_is_linked(struct lttng_bytecode_node *bytecode,
  * bytecode runtime.
  */
 static
-int _lttng_filter_link_bytecode(const struct lttng_event_desc *event_desc,
+int link_bytecode(const struct lttng_event_desc *event_desc,
                struct lttng_ctx *ctx,
                struct lttng_bytecode_node *bytecode,
                struct list_head *insert_loc)
@@ -457,6 +457,9 @@ int _lttng_filter_link_bytecode(const struct lttng_event_desc *event_desc,
        case LTTNG_BYTECODE_NODE_TYPE_FILTER:
                runtime->p.interpreter_funcs.filter = lttng_bytecode_filter_interpret;
                break;
+       case LTTNG_BYTECODE_NODE_TYPE_CAPTURE:
+               runtime->p.interpreter_funcs.capture = lttng_bytecode_capture_interpret_false;
+               break;
        default:
                WARN_ON(1);
        }
@@ -472,6 +475,9 @@ link_error:
        case LTTNG_BYTECODE_NODE_TYPE_FILTER:
                runtime->p.interpreter_funcs.filter = lttng_bytecode_filter_interpret_false;
                break;
+       case LTTNG_BYTECODE_NODE_TYPE_CAPTURE:
+               runtime->p.interpreter_funcs.capture = lttng_bytecode_capture_interpret_false;
+               break;
        default:
                WARN_ON(1);
        }
@@ -492,33 +498,54 @@ void lttng_bytecode_filter_sync_state(struct lttng_bytecode_runtime *runtime)
                runtime->interpreter_funcs.filter = lttng_bytecode_filter_interpret;
 }
 
+void lttng_bytecode_capture_sync_state(struct lttng_bytecode_runtime *runtime)
+{
+       struct lttng_bytecode_node *bc = runtime->bc;
+
+       if (!bc->enabler->enabled || runtime->link_failed)
+               runtime->interpreter_funcs.capture = lttng_bytecode_capture_interpret_false;
+       else
+               runtime->interpreter_funcs.capture = lttng_bytecode_capture_interpret;
+}
+
 /*
- * Link bytecode for all enablers referenced by an event.
+ * Given the lists of bytecode programs of an instance (event or event
+ * notifier) and of a matching enabler, try to link all the enabler's bytecode
+ * programs with the instance.
+ *
+ * This function is called after we confirmed that name enabler and the
+ * instance are matching names (or glob pattern matching).
  */
 void lttng_enabler_link_bytecode(const struct lttng_event_desc *event_desc,
                struct lttng_ctx *ctx,
-               struct list_head *bytecode_runtime_head,
-               struct lttng_enabler *enabler)
+               struct list_head *instance_bytecode_head,
+               struct list_head *enabler_bytecode_head)
 {
-       struct lttng_bytecode_node *bc;
+       struct lttng_bytecode_node *enabler_bc;
        struct lttng_bytecode_runtime *runtime;
 
-       /* Can only be called for events with desc attached */
        WARN_ON_ONCE(!event_desc);
 
-       /* Link each bytecode. */
-       list_for_each_entry(bc, &enabler->filter_bytecode_head, node) {
+       /* Go over all the bytecode programs of the enabler.  */
+       list_for_each_entry(enabler_bc, enabler_bytecode_head, node) {
                int found = 0, ret;
                struct list_head *insert_loc;
 
-               list_for_each_entry(runtime,
-                               bytecode_runtime_head, node) {
-                       if (runtime->bc == bc) {
+               /*
+                * Check if the current enabler bytecode program is already
+                * linked with the instance.
+                */
+               list_for_each_entry(runtime, instance_bytecode_head, node) {
+                       if (runtime->bc == enabler_bc) {
                                found = 1;
                                break;
                        }
                }
-               /* Skip bytecode already linked */
+
+               /*
+                * Skip bytecode already linked, go to the next enabler
+                * bytecode program.
+                */
                if (found)
                        continue;
 
@@ -528,19 +555,18 @@ void lttng_enabler_link_bytecode(const struct lttng_event_desc *event_desc,
                 * insert the new bytecode right after it.
                 */
                list_for_each_entry_reverse(runtime,
-                               bytecode_runtime_head, node) {
-                       if (runtime->bc->bc.seqnum <= bc->bc.seqnum) {
+                               instance_bytecode_head, node) {
+                       if (runtime->bc->bc.seqnum <= enabler_bc->bc.seqnum) {
                                /* insert here */
                                insert_loc = &runtime->node;
                                goto add_within;
                        }
                }
                /* Add to head to list */
-               insert_loc = bytecode_runtime_head;
+               insert_loc = instance_bytecode_head;
        add_within:
                dbg_printk("linking bytecode\n");
-               ret = _lttng_filter_link_bytecode(event_desc, ctx, bc,
-                       insert_loc);
+               ret = link_bytecode(event_desc, ctx, enabler_bc, insert_loc);
                if (ret) {
                        dbg_printk("[lttng filter] warning: cannot link event bytecode\n");
                }
This page took 0.023962 seconds and 4 git commands to generate.