#include <usterr-signal-safe.h>
#include <helper.h>
+#include "error.h"
#include "ltt-tracer.h"
#include "ltt-tracer-core.h"
};
static void _ltt_event_destroy(struct ltt_event *event);
+static void _ltt_loglevel_destroy(struct session_loglevel *sl);
static void _ltt_channel_destroy(struct ltt_channel *chan);
static int _ltt_event_unregister(struct ltt_event *event);
static
size_t name_len = strlen(name) + 1;
uint32_t hash = jhash(name, name_len - 1, 0);
int ret = 0;
+ struct lttng_ust_event event_param;
+
+ /*
+ * For this event, we need to lookup the loglevel. If active (in
+ * the active loglevels hash table), we must create the event.
+ */
+ if (desc->loglevel) {
+ const struct tracepoint_loglevel_entry *ev_ll;
+ struct loglevel_entry *loglevel;
+
+ ev_ll = *desc->loglevel;
+ loglevel = get_loglevel(ev_ll->identifier);
+ if (loglevel) {
+ struct session_loglevel *sl;
+
+ cds_list_for_each_entry(sl, &loglevel->session_list,
+ session_list) {
+ struct ltt_event *ev;
+ int ret;
+
+ memcpy(&event_param, &sl->event_param,
+ sizeof(event_param));
+ memcpy(event_param.name,
+ desc->name,
+ sizeof(event_param.name));
+ /* create event */
+ ret = ltt_event_create(sl->chan,
+ &event_param, NULL,
+ &ev);
+ if (ret) {
+ DBG("Error creating event");
+ continue;
+ }
+ cds_list_add(&ev->loglevel_list,
+ &sl->events);
+ }
+ }
+ }
head = &pending_probe_table[hash & (PENDING_PROBE_HASH_SIZE - 1)];
cds_hlist_for_each_entry_safe(e, node, p, head, node) {
return NULL;
CDS_INIT_LIST_HEAD(&session->chan);
CDS_INIT_LIST_HEAD(&session->events);
+ CDS_INIT_LIST_HEAD(&session->loglevels);
uuid_generate(session->uuid);
cds_list_add(&session->list, &sessions);
return session;
{
struct ltt_channel *chan, *tmpchan;
struct ltt_event *event, *tmpevent;
+ struct session_loglevel *loglevel, *tmploglevel;
int ret;
CMM_ACCESS_ONCE(session->active) = 0;
WARN_ON(ret);
}
synchronize_trace(); /* Wait for in-flight events to complete */
+ cds_list_for_each_entry_safe(loglevel, tmploglevel, &session->loglevels, list)
+ _ltt_loglevel_destroy(loglevel);
cds_list_for_each_entry_safe(event, tmpevent, &session->events, list)
_ltt_event_destroy(event);
cds_list_for_each_entry_safe(chan, tmpchan, &session->chan, list)
chan->ops->channel_destroy(chan);
}
+int ltt_loglevel_create(struct ltt_channel *chan,
+ struct lttng_ust_event *event_param,
+ struct session_loglevel **_sl)
+{
+ struct session_loglevel *sl;
+
+ sl = add_loglevel(event_param->name, chan, event_param);
+ if (!sl || IS_ERR(sl)) {
+ return PTR_ERR(sl);
+ }
+ *_sl = sl;
+ return 0;
+}
+
+static
+void _ltt_loglevel_destroy(struct session_loglevel *sl)
+{
+ _remove_loglevel(sl);
+}
+
/*
* Supports event creation while tracing session is active.
*/
}
break;
case LTTNG_UST_TRACEPOINT_LOGLEVEL:
- /*
- * TODO: add tracepoint loglevel to hash table, with
- * event info. Enable all events corresponding to
- * loglevel.
- */
+ assert(0);
break;
default:
WARN_ON_ONCE(1);