#include "ust-events-internal.h"
#include "wait.h"
#include "../libringbuffer/shm.h"
+#include "../libringbuffer/frontend_types.h"
+#include "../libringbuffer/frontend.h"
#include "../libcounter/counter.h"
#include "jhash.h"
#include <lttng/ust-abi.h>
+#include "context-provider-internal.h"
/*
* All operations within this file are called by the communication
static
void lttng_enabler_destroy(struct lttng_enabler *enabler);
+bool lttng_ust_validate_event_name(const struct lttng_ust_event_desc *desc)
+{
+ if (strlen(desc->probe_desc->provider_name) + 1 +
+ strlen(desc->event_name) >= LTTNG_UST_ABI_SYM_NAME_LEN)
+ return false;
+ return true;
+}
+
+void lttng_ust_format_event_name(const struct lttng_ust_event_desc *desc,
+ char *name)
+{
+ strcpy(name, desc->probe_desc->provider_name);
+ strcat(name, ":");
+ strcat(name, desc->event_name);
+}
+
/*
* Called with ust lock held.
*/
cds_list_del(<tng_chan->priv->node);
lttng_destroy_context(lttng_chan->priv->ctx);
- chan = lttng_chan->chan;
- handle = lttng_chan->handle;
+ chan = lttng_chan->priv->rb_chan;
+ handle = chan->handle;
channel_destroy(chan, handle, 0);
free(lttng_chan->parent);
free(lttng_chan->priv);
{
int ret;
struct lttng_ust_event_desc *desc;
+ char name[LTTNG_UST_ABI_SYM_NAME_LEN];
assert(event->priv->registered == 0);
desc = event->priv->desc;
- ret = lttng_ust_tp_probe_register_queue_release(desc->name,
+ lttng_ust_format_event_name(desc, name);
+ ret = lttng_ust_tp_probe_register_queue_release(name,
desc->probe_callback,
event, desc->signature);
WARN_ON_ONCE(ret);
{
int ret;
struct lttng_ust_event_desc *desc;
+ char name[LTTNG_UST_ABI_SYM_NAME_LEN];
assert(event->priv->registered == 1);
desc = event->priv->desc;
- ret = lttng_ust_tp_probe_unregister_queue_release(desc->name,
+ lttng_ust_format_event_name(desc, name);
+ ret = lttng_ust_tp_probe_unregister_queue_release(name,
desc->probe_callback,
event);
WARN_ON_ONCE(ret);
unsigned int hash_table_size,
struct lttng_ust_event_desc *desc)
{
- const char *event_name;
+ char name[LTTNG_UST_ABI_SYM_NAME_LEN];
size_t name_len;
uint32_t hash;
- event_name = desc->name;
- name_len = strlen(event_name);
+ lttng_ust_format_event_name(desc, name);
+ name_len = strlen(name);
- hash = jhash(event_name, name_len, 0);
+ hash = jhash(name, name_len, 0);
return &hash_table[hash & (hash_table_size - 1)];
}
int lttng_event_recorder_create(struct lttng_ust_event_desc *desc,
struct lttng_ust_channel_buffer *chan)
{
+ char name[LTTNG_UST_ABI_SYM_NAME_LEN];
struct lttng_ust_event_recorder *event_recorder;
struct lttng_ust_event_recorder_private *event_recorder_priv;
struct lttng_ust_session *session = chan->parent->session;
event_recorder->chan = chan;
/* Event will be enabled by enabler sync. */
+ event_recorder->parent->run_filter = lttng_ust_interpret_event_filter;
event_recorder->parent->enabled = 0;
event_recorder->parent->priv->registered = 0;
- CDS_INIT_LIST_HEAD(&event_recorder->parent->filter_bytecode_runtime_head);
+ CDS_INIT_LIST_HEAD(&event_recorder->parent->priv->filter_bytecode_runtime_head);
CDS_INIT_LIST_HEAD(&event_recorder->parent->priv->enablers_ref_head);
event_recorder->parent->priv->desc = desc;
else
uri = NULL;
+ lttng_ust_format_event_name(desc, name);
+
/* Fetch event ID from sessiond */
ret = ustcomm_register_event(notify_socket,
session,
session->priv->objd,
chan->priv->parent.objd,
- desc->name,
+ name,
loglevel,
desc->signature,
desc->nr_fields,
desc->fields,
uri,
- &event_recorder->id);
+ &event_recorder->priv->id);
if (ret < 0) {
DBG("Error (%d) registering event to sessiond", ret);
goto sessiond_register_error;
event_notifier_priv->error_counter_index = error_counter_index;
/* Event notifier will be enabled by enabler sync. */
+ event_notifier->parent->run_filter = lttng_ust_interpret_event_filter;
event_notifier->parent->enabled = 0;
event_notifier_priv->parent.registered = 0;
- CDS_INIT_LIST_HEAD(&event_notifier->parent->filter_bytecode_runtime_head);
- CDS_INIT_LIST_HEAD(&event_notifier->capture_bytecode_runtime_head);
+ CDS_INIT_LIST_HEAD(&event_notifier->parent->priv->filter_bytecode_runtime_head);
+ CDS_INIT_LIST_HEAD(&event_notifier->priv->capture_bytecode_runtime_head);
CDS_INIT_LIST_HEAD(&event_notifier_priv->parent.enablers_ref_head);
event_notifier_priv->parent.desc = desc;
event_notifier->notification_send = lttng_event_notifier_notification_send;
int lttng_desc_match_star_glob_enabler(struct lttng_ust_event_desc *desc,
struct lttng_enabler *enabler)
{
+ char name[LTTNG_UST_ABI_SYM_NAME_LEN];
int loglevel = 0;
unsigned int has_loglevel = 0;
+ lttng_ust_format_event_name(desc, name);
assert(enabler->format_type == LTTNG_ENABLER_FORMAT_STAR_GLOB);
if (!strutils_star_glob_match(enabler->event_param.name, SIZE_MAX,
- desc->name, SIZE_MAX))
+ name, SIZE_MAX))
return 0;
if (desc->loglevel) {
loglevel = *(*desc->loglevel);
int lttng_desc_match_event_enabler(struct lttng_ust_event_desc *desc,
struct lttng_enabler *enabler)
{
+ char name[LTTNG_UST_ABI_SYM_NAME_LEN];
int loglevel = 0;
unsigned int has_loglevel = 0;
+ lttng_ust_format_event_name(desc, name);
assert(enabler->format_type == LTTNG_ENABLER_FORMAT_EVENT);
- if (strcmp(desc->name, enabler->event_param.name))
+ if (strcmp(name, enabler->event_param.name))
return 0;
if (desc->loglevel) {
loglevel = *(*desc->loglevel);
excluder_name = (char *) (excluder->excluder.names)
+ count * LTTNG_UST_ABI_SYM_NAME_LEN;
len = strnlen(excluder_name, LTTNG_UST_ABI_SYM_NAME_LEN);
- if (len > 0 && strutils_star_glob_match(excluder_name, len, desc->name, SIZE_MAX))
- return 0;
+ if (len > 0) {
+ char name[LTTNG_UST_ABI_SYM_NAME_LEN];
+
+ lttng_ust_format_event_name(desc, name);
+ if (strutils_star_glob_match(excluder_name, len, name, SIZE_MAX)) {
+ return 0;
+ }
+ }
}
}
return 1;
ret = lttng_event_recorder_create(probe_desc->event_desc[i],
event_enabler->chan);
if (ret) {
- DBG("Unable to create event %s, error %d\n",
- probe_desc->event_desc[i]->name, ret);
+ DBG("Unable to create event \"%s:%s\", error %d\n",
+ probe_desc->provider_name,
+ probe_desc->event_desc[i]->event_name, ret);
}
}
}
*/
lttng_enabler_link_bytecode(event_recorder_priv->parent.desc,
&session->priv->ctx,
- &event_recorder_priv->pub->parent->filter_bytecode_runtime_head,
+ &event_recorder_priv->parent.filter_bytecode_runtime_head,
<tng_event_enabler_as_enabler(event_enabler)->filter_bytecode_head);
/* TODO: merge event context. */
cds_list_for_each_entry(event_recorder_priv, &session->priv->events_head, node) {
struct lttng_enabler_ref *enabler_ref;
struct lttng_ust_bytecode_runtime *runtime;
- int enabled = 0, has_enablers_without_bytecode = 0;
+ int enabled = 0, has_enablers_without_filter_bytecode = 0;
+ int nr_filters = 0;
/* Enable events */
cds_list_for_each_entry(enabler_ref,
&event_recorder_priv->parent.enablers_ref_head, node) {
if (enabler_ref->ref->enabled
&& cds_list_empty(&enabler_ref->ref->filter_bytecode_head)) {
- has_enablers_without_bytecode = 1;
+ has_enablers_without_filter_bytecode = 1;
break;
}
}
- event_recorder_priv->pub->parent->has_enablers_without_bytecode =
- has_enablers_without_bytecode;
+ event_recorder_priv->parent.has_enablers_without_filter_bytecode =
+ has_enablers_without_filter_bytecode;
/* Enable filters */
cds_list_for_each_entry(runtime,
- &event_recorder_priv->pub->parent->filter_bytecode_runtime_head, node) {
- lttng_bytecode_filter_sync_state(runtime);
+ &event_recorder_priv->parent.filter_bytecode_runtime_head, node) {
+ lttng_bytecode_sync_state(runtime);
+ nr_filters++;
}
+ CMM_STORE_SHARED(event_recorder_priv->parent.pub->eval_filter,
+ !(has_enablers_without_filter_bytecode || !nr_filters));
}
lttng_ust_tp_probe_prune_release_queue();
}
/* Check that the probe supports event notifiers, else report the error. */
if (!lttng_ust_probe_supports_event_notifier(probe_desc)) {
- ERR("Probe \"%s\" contains event \"%s\" which matches an enabled event notifier, "
+ ERR("Probe \"%s\" contains event \"%s:%s\" which matches an enabled event notifier, "
"but its version (%u.%u) is too old and does not implement event notifiers. "
"It needs to be recompiled against a newer version of LTTng-UST, otherwise "
"this event will not generate any notification.",
- probe_desc->provider,
- desc->name,
+ probe_desc->provider_name,
+ probe_desc->provider_name, desc->event_name,
probe_desc->major,
probe_desc->minor);
continue;
event_notifier_enabler->error_counter_index,
event_notifier_group);
if (ret) {
- DBG("Unable to create event_notifier %s, error %d\n",
- probe_desc->event_desc[i]->name, ret);
+ DBG("Unable to create event_notifier \"%s:%s\", error %d\n",
+ probe_desc->provider_name,
+ probe_desc->event_desc[i]->event_name, ret);
}
}
}
*/
lttng_enabler_link_bytecode(event_notifier_priv->parent.desc,
&event_notifier_group->ctx,
- &event_notifier_priv->pub->parent->filter_bytecode_runtime_head,
+ &event_notifier_priv->parent.filter_bytecode_runtime_head,
<tng_event_notifier_enabler_as_enabler(event_notifier_enabler)->filter_bytecode_head);
/*
* Link capture bytecodes if not linked yet.
*/
lttng_enabler_link_bytecode(event_notifier_priv->parent.desc,
- &event_notifier_group->ctx, &event_notifier_priv->pub->capture_bytecode_runtime_head,
+ &event_notifier_group->ctx, &event_notifier_priv->capture_bytecode_runtime_head,
&event_notifier_enabler->capture_bytecode_head);
event_notifier_priv->num_captures = event_notifier_enabler->num_captures;
cds_list_for_each_entry(event_notifier_priv, &event_notifier_group->event_notifiers_head, node) {
struct lttng_enabler_ref *enabler_ref;
struct lttng_ust_bytecode_runtime *runtime;
- int enabled = 0, has_enablers_without_bytecode = 0;
+ int enabled = 0, has_enablers_without_filter_bytecode = 0;
+ int nr_filters = 0, nr_captures = 0;
/* Enable event_notifiers */
cds_list_for_each_entry(enabler_ref,
&event_notifier_priv->parent.enablers_ref_head, node) {
if (enabler_ref->ref->enabled
&& cds_list_empty(&enabler_ref->ref->filter_bytecode_head)) {
- has_enablers_without_bytecode = 1;
+ has_enablers_without_filter_bytecode = 1;
break;
}
}
- event_notifier_priv->pub->parent->has_enablers_without_bytecode =
- has_enablers_without_bytecode;
+ event_notifier_priv->parent.has_enablers_without_filter_bytecode =
+ has_enablers_without_filter_bytecode;
/* Enable filters */
cds_list_for_each_entry(runtime,
- &event_notifier_priv->pub->parent->filter_bytecode_runtime_head, node) {
- lttng_bytecode_filter_sync_state(runtime);
+ &event_notifier_priv->parent.filter_bytecode_runtime_head, node) {
+ lttng_bytecode_sync_state(runtime);
+ nr_filters++;
}
+ CMM_STORE_SHARED(event_notifier_priv->parent.pub->eval_filter,
+ !(has_enablers_without_filter_bytecode || !nr_filters));
/* Enable captures. */
cds_list_for_each_entry(runtime,
- &event_notifier_priv->pub->capture_bytecode_runtime_head, node) {
- lttng_bytecode_capture_sync_state(runtime);
+ &event_notifier_priv->capture_bytecode_runtime_head, node) {
+ lttng_bytecode_sync_state(runtime);
+ nr_captures++;
}
+ CMM_STORE_SHARED(event_notifier_priv->pub->eval_capture,
+ !!nr_captures);
}
lttng_ust_tp_probe_prune_release_queue();
}
abort();
}
}
+
+int lttng_ust_session_uuid_validate(struct lttng_ust_session *session,
+ unsigned char *uuid)
+{
+ if (!session)
+ return 0;
+ /* Compare UUID with session. */
+ if (session->priv->uuid_set) {
+ if (memcmp(session->priv->uuid, uuid, LTTNG_UST_UUID_LEN)) {
+ return -1;
+ }
+ } else {
+ memcpy(session->priv->uuid, uuid, LTTNG_UST_UUID_LEN);
+ session->priv->uuid_set = true;
+ }
+ return 0;
+
+}