X-Git-Url: http://git.lttng.org./?a=blobdiff_plain;f=liblttng-ust%2Fltt-events.c;h=ee82413db8f8707b30884287fc5723434227200a;hb=3f6fd224cc31bdab2e3d8430c3e5e9ff17862c14;hp=120dffff3070f59bd8aea367270d538ac8e9752c;hpb=cd54f6d934faf715cbd12fa9665e94b6fe367802;p=lttng-ust.git diff --git a/liblttng-ust/ltt-events.c b/liblttng-ust/ltt-events.c index 120dffff..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,9 +249,10 @@ 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, &ev); @@ -258,8 +262,8 @@ int pending_probe_fix_events(const struct lttng_event_desc *desc) } cds_list_add(&ev->wildcard_list, &sw->events); - lttng_filter_event_link_bytecode(ev, - sw->filter_bytecode); + lttng_filter_event_link_wildcard_bytecode(ev, + sw); } } } @@ -282,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); @@ -296,8 +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, - event->filter_bytecode); + lttng_filter_event_link_bytecode(event); } return ret; } @@ -513,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. @@ -556,6 +563,8 @@ int ltt_event_create(struct ltt_channel *chan, */ 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(); @@ -654,8 +663,8 @@ void _ltt_event_destroy(struct ltt_event *event) } cds_list_del(&event->list); lttng_destroy_context(event->ctx); - free(event->filter_bytecode); - free(event->filter_data); + lttng_free_event_filter_runtime(event); + lttng_free_event_filter_bytecode(event); free(event); } @@ -726,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, @@ -927,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"); @@ -1023,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" + " uint64_t content_size;\n" + " uint64_t packet_size;\n" " unsigned long events_discarded;\n" - " uint32_t content_size;\n" - " uint32_t packet_size;\n" " uint32_t cpu_id;\n" "};\n\n" ); @@ -1112,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; @@ -1168,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" @@ -1180,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, @@ -1338,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 @@ -1367,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); } @@ -1388,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); @@ -1420,7 +1452,7 @@ void _remove_wildcard(struct session_wildcard *wildcard) cds_list_del(&wildcard->entry->list); free(wildcard->entry); } - free(wildcard->filter_bytecode); + lttng_free_wildcard_filter_bytecode(wildcard); free(wildcard); }