X-Git-Url: http://git.lttng.org./?a=blobdiff_plain;ds=inline;f=liblttng-ust%2Fltt-events.c;h=ee82413db8f8707b30884287fc5723434227200a;hb=3f6fd224cc31bdab2e3d8430c3e5e9ff17862c14;hp=aafa126c47a064ff5e368af93236d7f66a4790d4;hpb=9501d22f55b3a23f382f631c99b2325d1419b5da;p=lttng-ust.git diff --git a/liblttng-ust/ltt-events.c b/liblttng-ust/ltt-events.c index aafa126c..ee82413d 100644 --- a/liblttng-ust/ltt-events.c +++ b/liblttng-ust/ltt-events.c @@ -235,6 +235,9 @@ int pending_probe_fix_events(const struct lttng_event_desc *desc) { struct wildcard_entry *wildcard; + //FIXME: should iterate on all match for filter. + //FIXME: should re-use pending event if present rather + //than create duplicate. wildcard = match_wildcard(desc); if (strcmp(desc->name, "lttng_ust:metadata") && wildcard) { struct session_wildcard *sw; @@ -246,19 +249,21 @@ int pending_probe_fix_events(const struct lttng_event_desc *desc) memcpy(&event_param, &sw->event_param, sizeof(event_param)); - memcpy(event_param.name, + strncpy(event_param.name, desc->name, sizeof(event_param.name)); + event_param.name[sizeof(event_param.name) - 1] = '\0'; /* create event */ ret = ltt_event_create(sw->chan, - &event_param, NULL, - &ev); + &event_param, &ev); if (ret) { DBG("Error creating event"); continue; } cds_list_add(&ev->wildcard_list, &sw->events); + lttng_filter_event_link_wildcard_bytecode(ev, + sw); } } } @@ -281,6 +286,8 @@ int pending_probe_fix_events(const struct lttng_event_desc *desc) if (strncmp(name, e->name, LTTNG_UST_SYM_NAME_LEN - 1)) { continue; } + /* TODO: wildcard same as pending event: duplicate */ + /* TODO: Should apply filter though */ event = e->event; chan = event->chan; assert(!event->desc); @@ -295,6 +302,7 @@ int pending_probe_fix_events(const struct lttng_event_desc *desc) event->id = chan->free_event_id++; ret |= _ltt_event_metadata_statedump(chan->session, chan, event); + lttng_filter_event_link_bytecode(event); } return ret; } @@ -500,7 +508,6 @@ void _ltt_channel_destroy(struct ltt_channel *chan) */ int ltt_event_create(struct ltt_channel *chan, struct lttng_ust_event *event_param, - void *filter, struct ltt_event **_event) { const struct lttng_event_desc *desc = NULL; /* silence gcc */ @@ -511,6 +518,8 @@ int ltt_event_create(struct ltt_channel *chan, ret = -ENOMEM; goto full; } + //FIXME: re-use event if already registered by wildcard or + //if we have a pending probe.... (CHECK) /* * This is O(n^2) (for each event, the loop is called at event * creation). Might require a hash if we have lots of events. @@ -548,13 +557,14 @@ int ltt_event_create(struct ltt_channel *chan, goto cache_error; } event->chan = chan; - event->filter = filter; /* * used_event_id counts the maximum number of event IDs that can * register if all probes register. */ chan->used_event_id++; event->enabled = 1; + CDS_INIT_LIST_HEAD(&event->filter_bytecode); + CDS_INIT_LIST_HEAD(&event->bytecode_runtime); event->instrumentation = event_param->instrumentation; /* Populate ltt_event structure before tracepoint registration. */ cmm_smp_wmb(); @@ -653,6 +663,8 @@ void _ltt_event_destroy(struct ltt_event *event) } cds_list_del(&event->list); lttng_destroy_context(event->ctx); + lttng_free_event_filter_runtime(event); + lttng_free_event_filter_bytecode(event); free(event); } @@ -723,6 +735,9 @@ int _ltt_field_statedump(struct ltt_session *session, { int ret = 0; + if (field->nowrite) + return 0; + switch (field->type.atype) { case atype_integer: ret = lttng_metadata_printf(session, @@ -924,6 +939,14 @@ int _ltt_event_metadata_statedump(struct ltt_session *session, if (ret) goto end; + if (event->desc->u.ext.model_emf_uri) { + ret = lttng_metadata_printf(session, + " model.emf.uri = \"%s\";\n", + *(event->desc->u.ext.model_emf_uri)); + if (ret) + goto end; + } + if (event->ctx) { ret = lttng_metadata_printf(session, " context := struct {\n"); @@ -1020,9 +1043,9 @@ int _ltt_stream_packet_context_declare(struct ltt_session *session) "struct packet_context {\n" " uint64_clock_monotonic_t timestamp_begin;\n" " uint64_clock_monotonic_t timestamp_end;\n" - " uint32_t events_discarded;\n" - " uint32_t content_size;\n" - " uint32_t packet_size;\n" + " uint64_t content_size;\n" + " uint64_t packet_size;\n" + " unsigned long events_discarded;\n" " uint32_t cpu_id;\n" "};\n\n" ); @@ -1109,6 +1132,7 @@ int _ltt_session_metadata_statedump(struct ltt_session *session) struct ltt_event *event; int ret = 0; char procname[LTTNG_UST_PROCNAME_LEN] = ""; + char hostname[HOST_NAME_MAX]; if (!CMM_ACCESS_ONCE(session->active)) return 0; @@ -1131,6 +1155,7 @@ int _ltt_session_metadata_statedump(struct ltt_session *session) "typealias integer { size = 16; align = %u; signed = false; } := uint16_t;\n" "typealias integer { size = 32; align = %u; signed = false; } := uint32_t;\n" "typealias integer { size = 64; align = %u; signed = false; } := uint64_t;\n" + "typealias integer { size = %u; align = %u; signed = false; } := unsigned long;\n" "typealias integer { size = 5; align = 1; signed = false; } := uint5_t;\n" "typealias integer { size = 27; align = 1; signed = false; } := uint27_t;\n" "\n" @@ -1149,6 +1174,8 @@ int _ltt_session_metadata_statedump(struct ltt_session *session) lttng_alignof(uint16_t) * CHAR_BIT, lttng_alignof(uint32_t) * CHAR_BIT, lttng_alignof(uint64_t) * CHAR_BIT, + sizeof(unsigned long) * CHAR_BIT, + lttng_alignof(unsigned long) * CHAR_BIT, CTF_SPEC_MAJOR, CTF_SPEC_MINOR, uuid_s, @@ -1162,10 +1189,15 @@ int _ltt_session_metadata_statedump(struct ltt_session *session) goto end; /* ignore error, just use empty string if error. */ + hostname[0] = '\0'; + ret = gethostname(hostname, sizeof(hostname)); + if (ret && errno == ENAMETOOLONG) + hostname[HOST_NAME_MAX - 1] = '\0'; lttng_ust_getprocname(procname); procname[LTTNG_UST_PROCNAME_LEN - 1] = '\0'; ret = lttng_metadata_printf(session, "env {\n" + " hostname = \"%s\";\n" " vpid = %d;\n" " procname = \"%s\";\n" " domain = \"ust\";\n" @@ -1174,6 +1206,7 @@ int _ltt_session_metadata_statedump(struct ltt_session *session) " tracer_minor = %u;\n" " tracer_patchlevel = %u;\n" "};\n\n", + hostname, (int) getpid(), procname, LTTNG_UST_MAJOR_VERSION, @@ -1332,6 +1365,9 @@ struct session_wildcard *add_wildcard(struct ltt_channel *chan, size_t name_len = strlen(event_param->name) + 1; int found = 0; + //FIXME: ensure that wildcard re-use pending events, or + //re-use actual events, applying its filter on top. + /* * Try to find global wildcard entry. Given that this is shared * across all sessions, we need to check for exact loglevel @@ -1361,6 +1397,7 @@ struct session_wildcard *add_wildcard(struct ltt_channel *chan, memcpy(&e->name[0], event_param->name, name_len); e->loglevel_type = event_param->loglevel_type; e->loglevel = event_param->loglevel; + CDS_INIT_LIST_HEAD(&e->filter_bytecode); cds_list_add(&e->list, &wildcard_list); CDS_INIT_LIST_HEAD(&e->session_list); } @@ -1382,6 +1419,7 @@ struct session_wildcard *add_wildcard(struct ltt_channel *chan, sw->event_param.instrumentation = LTTNG_UST_TRACEPOINT; sw->event_param.loglevel_type = event_param->loglevel_type; sw->event_param.loglevel = event_param->loglevel; + CDS_INIT_LIST_HEAD(&sw->filter_bytecode); CDS_INIT_LIST_HEAD(&sw->events); cds_list_add(&sw->list, &chan->session->wildcards); cds_list_add(&sw->session_list, &e->session_list); @@ -1414,6 +1452,7 @@ void _remove_wildcard(struct session_wildcard *wildcard) cds_list_del(&wildcard->entry->list); free(wildcard->entry); } + lttng_free_wildcard_filter_bytecode(wildcard); free(wildcard); }