Generalize `lttng_enabler_link_bytecode()` bytecode list
authorFrancis Deslauriers <francis.deslauriers@efficios.com>
Mon, 27 Apr 2020 21:21:25 +0000 (17:21 -0400)
committerMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Thu, 26 Nov 2020 18:36:44 +0000 (13:36 -0500)
So it can be used for both filter and capture bytecode runtimes

Signed-off-by: Francis Deslauriers <francis.deslauriers@efficios.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
Change-Id: I61ac07545f8db2964f8ea0a7d40ec7be306efe90

liblttng-ust/lttng-bytecode.c
liblttng-ust/lttng-events.c
liblttng-ust/ust-events-internal.h

index a05117a14134fd19f98601e01a8a47c1f0e800e0..a6527ff191e1a34f706933523a1248c48d4c2321 100644 (file)
@@ -519,31 +519,43 @@ void lttng_bytecode_filter_sync_state(struct lttng_bytecode_runtime *runtime)
 }
 
 /*
- * Link all bytecodes of the enabler referenced in the provided bytecode list.
+ * Given the lists of bytecode programs of an instance (trigger or event) 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 name matching (or glob pattern matching).
  */
 void lttng_enabler_link_bytecode(const struct lttng_event_desc *event_desc,
                struct lttng_ctx **ctx,
-               struct cds_list_head *bytecode_runtime_head,
-               struct lttng_enabler *enabler)
+               struct cds_list_head *instance_bytecode_head,
+               struct cds_list_head *enabler_bytecode_head)
 {
-       struct lttng_ust_bytecode_node *bc;
+       struct lttng_ust_bytecode_node *enabler_bc;
        struct lttng_bytecode_runtime *runtime;
 
        assert(event_desc);
 
-       /* Link each bytecode. */
-       cds_list_for_each_entry(bc, &enabler->filter_bytecode_head, node) {
+       /* Go over all the bytecode programs of the enabler. */
+       cds_list_for_each_entry(enabler_bc, enabler_bytecode_head, node) {
                int found = 0, ret;
                struct cds_list_head *insert_loc;
 
-               cds_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.
+                */
+               cds_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;
 
@@ -553,8 +565,8 @@ void lttng_enabler_link_bytecode(const struct lttng_event_desc *event_desc,
                 * insert the new bytecode right after it.
                 */
                cds_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;
@@ -562,10 +574,10 @@ void lttng_enabler_link_bytecode(const struct lttng_event_desc *event_desc,
                }
 
                /* Add to head to list */
-               insert_loc = bytecode_runtime_head;
+               insert_loc = instance_bytecode_head;
        add_within:
                dbg_printf("linking bytecode\n");
-               ret = link_bytecode(event_desc, ctx, bc, insert_loc);
+               ret = link_bytecode(event_desc, ctx, enabler_bc, insert_loc);
                if (ret) {
                        dbg_printf("[lttng filter] warning: cannot link event bytecode\n");
                }
index d6d0642d8535c8867026326b339f08119648d1e1..5941365ab0eb7284398c8b7774edb4706fcf7b27 100644 (file)
@@ -1223,7 +1223,7 @@ int lttng_event_enabler_ref_events(struct lttng_event_enabler *event_enabler)
                lttng_enabler_link_bytecode(event->desc,
                        &session->ctx,
                        &event->filter_bytecode_runtime_head,
-                       lttng_event_enabler_as_enabler(event_enabler));
+                       &lttng_event_enabler_as_enabler(event_enabler)->filter_bytecode_head);
 
                /* TODO: merge event context. */
        }
@@ -1755,8 +1755,9 @@ int lttng_event_notifier_enabler_ref_event_notifiers(
                 * Link filter bytecodes if not linked yet.
                 */
                lttng_enabler_link_bytecode(event_notifier->desc,
-                       &event_notifier_group->ctx, &event_notifier->filter_bytecode_runtime_head,
-                       lttng_event_notifier_enabler_as_enabler(event_notifier_enabler));
+                       &event_notifier_group->ctx,
+                       &event_notifier->filter_bytecode_runtime_head,
+                       &lttng_event_notifier_enabler_as_enabler(event_notifier_enabler)->filter_bytecode_head);
        }
 end:
        return 0;
index 24393936f2df4b40f4ab48cbd099e28d8612fb2c..0fc0b795de3e08179e98ada090ad963e0e1d6313 100644 (file)
@@ -150,16 +150,16 @@ int lttng_event_enabler_attach_exclusion(struct lttng_event_enabler *enabler,
                struct lttng_ust_excluder_node *excluder);
 
 /*
- * Synchronize bytecodes for the enabler and the event.
+ * Synchronize bytecodes for the enabler and the instance (event or trigger).
  *
- * This function goes over all bytecode programs of the event enabler to ensure
- * each is linked to the provided event.
+ * This function goes over all bytecode programs of the enabler (event or
+ * trigger enabler) to ensure each is linked to the provided instance.
  */
 LTTNG_HIDDEN
 void lttng_enabler_link_bytecode(const struct lttng_event_desc *event_desc,
                struct lttng_ctx **ctx,
-               struct cds_list_head *bytecode_runtime_head,
-               struct lttng_enabler *enabler);
+               struct cds_list_head *instance_bytecode_runtime_head,
+               struct cds_list_head *enabler_bytecode_runtime_head);
 
 /*
  * Allocate and initialize a `struct lttng_event_notifier_group` object.
This page took 0.027681 seconds and 4 git commands to generate.