*/
struct lttng_bytecode_runtime {
/* Associated bytecode */
- struct lttng_ust_filter_bytecode_node *bc;
- uint64_t (*filter)(void *filter_data, const char *filter_stack_data);
+ struct lttng_ust_bytecode_node *bc;
+ uint64_t (*filter)(void *interpreter_data,
+ const char *interpreter_stack_data);
int link_failed;
struct cds_list_head node; /* list of bytecode runtime in event */
/*
static
void lttng_enabler_destroy(struct lttng_enabler *enabler)
{
- struct lttng_ust_filter_bytecode_node *filter_node, *tmp_filter_node;
+ struct lttng_ust_bytecode_node *filter_node, *tmp_filter_node;
struct lttng_ust_excluder_node *excluder_node, *tmp_excluder_node;
if (!enabler) {
static
void _lttng_enabler_attach_filter_bytecode(struct lttng_enabler *enabler,
- struct lttng_ust_filter_bytecode_node *bytecode)
+ struct lttng_ust_bytecode_node *bytecode)
{
bytecode->enabler = enabler;
cds_list_add_tail(&bytecode->node, &enabler->filter_bytecode_head);
}
int lttng_event_enabler_attach_filter_bytecode(struct lttng_event_enabler *event_enabler,
- struct lttng_ust_filter_bytecode_node *bytecode)
+ struct lttng_ust_bytecode_node *bytecode)
{
_lttng_enabler_attach_filter_bytecode(
lttng_event_enabler_as_enabler(event_enabler), bytecode);
int lttng_event_notifier_enabler_attach_filter_bytecode(
struct lttng_event_notifier_enabler *event_notifier_enabler,
- struct lttng_ust_filter_bytecode_node *bytecode)
+ struct lttng_ust_bytecode_node *bytecode)
{
_lttng_enabler_attach_filter_bytecode(
lttng_event_notifier_enabler_as_enabler(event_notifier_enabler),
}
static
-int bytecode_is_linked(struct lttng_ust_filter_bytecode_node *filter_bytecode,
+int bytecode_is_linked(struct lttng_ust_bytecode_node *bytecode,
struct cds_list_head *bytecode_runtime_head)
{
struct lttng_bytecode_runtime *bc_runtime;
cds_list_for_each_entry(bc_runtime, bytecode_runtime_head, node) {
- if (bc_runtime->bc == filter_bytecode)
+ if (bc_runtime->bc == bytecode)
return 1;
}
return 0;
static
int _lttng_filter_link_bytecode(const struct lttng_event_desc *event_desc,
struct lttng_ctx **ctx,
- struct lttng_ust_filter_bytecode_node *filter_bytecode,
+ struct lttng_ust_bytecode_node *bytecode,
struct cds_list_head *insert_loc)
{
int ret, offset, next_offset;
struct bytecode_runtime *runtime = NULL;
size_t runtime_alloc_len;
- if (!filter_bytecode)
+ if (!bytecode)
return 0;
/* Bytecode already linked */
- if (bytecode_is_linked(filter_bytecode, insert_loc))
+ if (bytecode_is_linked(bytecode, insert_loc))
return 0;
dbg_printf("Linking...\n");
/* We don't need the reloc table in the runtime */
- runtime_alloc_len = sizeof(*runtime) + filter_bytecode->bc.reloc_offset;
+ runtime_alloc_len = sizeof(*runtime) + bytecode->bc.reloc_offset;
runtime = zmalloc(runtime_alloc_len);
if (!runtime) {
ret = -ENOMEM;
goto alloc_error;
}
- runtime->p.bc = filter_bytecode;
+ runtime->p.bc = bytecode;
runtime->p.pctx = ctx;
- runtime->len = filter_bytecode->bc.reloc_offset;
+ runtime->len = bytecode->bc.reloc_offset;
/* copy original bytecode */
- memcpy(runtime->code, filter_bytecode->bc.data, runtime->len);
+ memcpy(runtime->code, bytecode->bc.data, runtime->len);
/*
* apply relocs. Those are a uint16_t (offset in bytecode)
* followed by a string (field name).
*/
- for (offset = filter_bytecode->bc.reloc_offset;
- offset < filter_bytecode->bc.len;
+ for (offset = bytecode->bc.reloc_offset;
+ offset < bytecode->bc.len;
offset = next_offset) {
uint16_t reloc_offset =
- *(uint16_t *) &filter_bytecode->bc.data[offset];
+ *(uint16_t *) &bytecode->bc.data[offset];
const char *name =
- (const char *) &filter_bytecode->bc.data[offset + sizeof(uint16_t)];
+ (const char *) &bytecode->bc.data[offset + sizeof(uint16_t)];
ret = apply_reloc(event_desc, runtime, runtime->len, reloc_offset, name);
if (ret) {
void lttng_filter_sync_state(struct lttng_bytecode_runtime *runtime)
{
- struct lttng_ust_filter_bytecode_node *bc = runtime->bc;
+ struct lttng_ust_bytecode_node *bc = runtime->bc;
if (!bc->enabler->enabled || runtime->link_failed)
runtime->filter = lttng_filter_interpret_bytecode_false;
struct cds_list_head *bytecode_runtime_head,
struct lttng_enabler *enabler)
{
- struct lttng_ust_filter_bytecode_node *bc;
+ struct lttng_ust_bytecode_node *bc;
struct lttng_bytecode_runtime *runtime;
assert(event_desc);
}
/*
- * We own the filter_bytecode if we return success.
+ * We own the bytecode if we return success.
*/
int lttng_filter_enabler_attach_bytecode(struct lttng_enabler *enabler,
- struct lttng_ust_filter_bytecode_node *filter_bytecode)
+ struct lttng_ust_bytecode_node *bytecode)
{
- cds_list_add(&filter_bytecode->node, &enabler->filter_bytecode_head);
+ cds_list_add(&bytecode->node, &enabler->filter_bytecode_head);
return 0;
}
case LTTNG_UST_FILTER:
return lttng_event_notifier_enabler_attach_filter_bytecode(
event_notifier_enabler,
- (struct lttng_ust_filter_bytecode_node *) arg);
+ (struct lttng_ust_bytecode_node *) arg);
case LTTNG_UST_EXCLUSION:
return lttng_event_notifier_enabler_attach_exclusion(event_notifier_enabler,
(struct lttng_ust_excluder_node *) arg);
int ret;
ret = lttng_event_enabler_attach_filter_bytecode(enabler,
- (struct lttng_ust_filter_bytecode_node *) arg);
+ (struct lttng_ust_bytecode_node *) arg);
if (ret)
return ret;
return 0;
case LTTNG_UST_FILTER:
{
/* Receive filter data */
- struct lttng_ust_filter_bytecode_node *bytecode;
+ struct lttng_ust_bytecode_node *bytecode;
if (lum->u.filter.data_size > FILTER_BYTECODE_MAX_LEN) {
ERR("Filter data size is too large: %u bytes",
ret = -ENOMEM;
goto error;
}
+
len = ustcomm_recv_unix_sock(sock, bytecode->bc.data,
lum->u.filter.data_size);
switch (len) {
uint64_t user_token; /* User-provided token */
};
-struct lttng_ust_filter_bytecode_node {
+enum lttng_ust_bytecode_node_type {
+ LTTNG_UST_BYTECODE_NODE_TYPE_FILTER,
+};
+
+struct lttng_ust_bytecode_node {
+ enum lttng_ust_bytecode_node_type type;
struct cds_list_head node;
struct lttng_enabler *enabler;
- /*
- * struct lttng_ust_filter_bytecode has var. sized array, must
- * be last field.
- */
- struct lttng_ust_filter_bytecode bc;
+ struct {
+ uint32_t len;
+ uint32_t reloc_offset;
+ uint64_t seqnum;
+ char data[];
+ } bc;
};
struct lttng_ust_excluder_node {
LTTNG_HIDDEN
int lttng_event_enabler_attach_filter_bytecode(
struct lttng_event_enabler *enabler,
- struct lttng_ust_filter_bytecode_node *bytecode);
+ struct lttng_ust_bytecode_node *bytecode);
/*
* Attach an application context to an event enabler.
LTTNG_HIDDEN
int lttng_event_notifier_enabler_attach_filter_bytecode(
struct lttng_event_notifier_enabler *event_notifier_enabler,
- struct lttng_ust_filter_bytecode_node *bytecode);
+ struct lttng_ust_bytecode_node *bytecode);
/*
* Attach exclusion list to `struct lttng_event_notifier_enabler` and all