#include <urcu/list.h>
#include <urcu/hlist.h>
#include <pthread.h>
-#include <urcu-bp.h>
-#include <urcu/compiler.h>
-#include <urcu/uatomic.h>
#include <uuid/uuid.h>
-#include <lttng/tracepoint.h>
#include <errno.h>
#include <sys/shm.h>
#include <sys/ipc.h>
+#include <stdint.h>
+#include <stddef.h>
+
+#include <urcu-bp.h>
+#include <urcu/compiler.h>
+#include <urcu/uatomic.h>
+#include <urcu/arch.h>
+
+#include <lttng/tracepoint.h>
#include <lttng/ust-events.h>
-#include <lttng/usterr-signal-safe.h>
-#include "lttng/core.h"
+
+#include <usterr-signal-safe.h>
+#include <helper.h>
+
#include "ltt-tracer.h"
#include "ltt-tracer-core.h"
-#include "lttng/wait.h"
+#include "wait.h"
#include "../libringbuffer/shm.h"
-
-typedef u32 uint32_t;
-#include <lttng/kcompat/jhash.h>
+#include "jhash.h"
/*
* The sessions mutex is the centralized mutex across UST tracing
* control and probe registration. All operations within this file are
* called by the communication thread, under ust_lock protection.
*/
-static DEFINE_MUTEX(sessions_mutex);
+static pthread_mutex_t sessions_mutex = PTHREAD_MUTEX_INITIALIZER;
void ust_lock(void)
{
struct cds_hlist_head *head;
struct ust_pending_probe *e;
size_t name_len = strlen(name) + 1;
- u32 hash = jhash(name, name_len - 1, 0);
+ uint32_t hash = jhash(name, name_len - 1, 0);
head = &pending_probe_table[hash & (PENDING_PROBE_HASH_SIZE - 1)];
e = zmalloc(sizeof(struct ust_pending_probe) + name_len);
struct ust_pending_probe *e;
const char *name = desc->name;
size_t name_len = strlen(name) + 1;
- u32 hash = jhash(name, name_len - 1, 0);
+ uint32_t hash = jhash(name, name_len - 1, 0);
int ret = 0;
head = &pending_probe_table[hash & (PENDING_PROBE_HASH_SIZE - 1)];
/*
* Supports event creation while tracing session is active.
*/
-struct ltt_event *ltt_event_create(struct ltt_channel *chan,
- struct lttng_ust_event *event_param,
- void *filter)
+int ltt_event_create(struct ltt_channel *chan,
+ struct lttng_ust_event *event_param,
+ void *filter,
+ struct ltt_event **_event)
{
struct ltt_event *event;
- int ret;
+ int ret = 0;
- if (chan->used_event_id == -1UL)
+ if (chan->used_event_id == -1UL) {
+ ret = -ENOMEM;
goto full;
+ }
/*
* 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.
*/
- cds_list_for_each_entry(event, &chan->session->events, list)
- if (event->desc && !strcmp(event->desc->name, event_param->name))
+ cds_list_for_each_entry(event, &chan->session->events, list) {
+ if (event->desc && !strcmp(event->desc->name, event_param->name)) {
+ ret = -EEXIST;
goto exist;
+ }
+ }
event = zmalloc(sizeof(struct ltt_event));
- if (!event)
+ if (!event) {
+ ret = -ENOMEM;
goto cache_error;
+ }
event->chan = chan;
event->filter = filter;
/*
goto add_pending_error;
}
break;
+ case LTTNG_UST_TRACEPOINT_LOGLEVEL:
+ /*
+ * TODO: add tracepoint loglevel to hash table, with
+ * event info. Enable all events corresponding to
+ * loglevel.
+ */
+ break;
default:
WARN_ON_ONCE(1);
}
goto statedump_error;
}
cds_list_add(&event->list, &chan->session->events);
- return event;
+ *_event = event;
+ return 0;
statedump_error:
if (event->desc) {
cache_error:
exist:
full:
- return NULL;
+ return ret;
}
/*
ret = lttng_metadata_printf(session,
"event {\n"
- " name = %s;\n"
+ " name = \"%s\";\n"
" id = %u;\n"
" stream_id = %u;\n",
event->desc->name,