/*
* ltt-events.c
*
- * Copyright 2010 (c) - Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
- *
* Holds LTTng per-session event registry.
*
- * Dual LGPL v2.1/GPL v2 license.
+ * Copyright (C) 2010-2012 Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; only
+ * version 2.1 of the License.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#define _GNU_SOURCE
#include <stddef.h>
#include <inttypes.h>
#include <time.h>
+#include <sys/prctl.h>
#include "clock.h"
#include <urcu-bp.h>
#include "../libringbuffer/shm.h"
#include "jhash.h"
+#define PROCNAME_LEN 17
+
/*
* The sessions mutex is the centralized mutex across UST tracing
* control and probe registration. All operations within this file are
remove_pending_probe(e);
ret |= __tracepoint_probe_register(name,
event->desc->probe_callback,
- event);
+ event, event->desc->signature);
if (ret)
continue;
event->id = chan->free_event_id++;
* headers. Therefore the "chan" information used as input
* should be already accessible.
*/
- chan = transport->ops.channel_create("[lttng]", buf_addr,
+ chan = transport->ops.channel_create(transport_name, buf_addr,
subbuf_size, num_subbuf, switch_timer_interval,
read_timer_interval, shm_fd, wait_fd,
memory_map_size, chan_priv_init);
struct ltt_event *event;
int ret = 0;
- if (chan->used_event_id == -1UL) {
+ if (chan->used_event_id == -1U) {
ret = -ENOMEM;
goto full;
}
if (event->desc) {
ret = __tracepoint_probe_register(event_param->name,
event->desc->probe_callback,
- event);
+ event, event->desc->signature);
if (ret)
goto register_error;
event->id = chan->free_event_id++;
struct ltt_event *event)
{
int ret = 0;
+ int loglevel = TRACE_DEFAULT;
if (event->metadata_dumped || !CMM_ACCESS_ONCE(session->active))
return 0;
if (ret)
goto end;
- if (event->desc->loglevel) {
- ret = lttng_metadata_printf(session,
- " loglevel = %d;\n",
- *(*event->desc->loglevel));
- if (ret)
- goto end;
- }
+ if (event->desc->loglevel)
+ loglevel = *(*event->desc->loglevel);
+
+ ret = lttng_metadata_printf(session,
+ " loglevel = %d;\n",
+ loglevel);
+ if (ret)
+ goto end;
if (event->ctx) {
ret = lttng_metadata_printf(session,
struct ltt_channel *chan;
struct ltt_event *event;
int ret = 0;
+ char procname[PROCNAME_LEN] = "";
if (!CMM_ACCESS_ONCE(session->active))
return 0;
lttng_alignof(uint16_t) * CHAR_BIT,
lttng_alignof(uint32_t) * CHAR_BIT,
lttng_alignof(uint64_t) * CHAR_BIT,
- CTF_VERSION_MAJOR,
- CTF_VERSION_MINOR,
+ CTF_SPEC_MAJOR,
+ CTF_SPEC_MINOR,
uuid_s,
#if (BYTE_ORDER == BIG_ENDIAN)
"be"
if (ret)
goto end;
+ /* ignore error, just use empty string if error. */
+ (void) prctl(PR_GET_NAME, (unsigned long) procname, 0, 0, 0);
+ procname[PROCNAME_LEN - 1] = '\0';
+ ret = lttng_metadata_printf(session,
+ "env {\n"
+ " vpid = %d;\n"
+ " procname = \"%s\";\n"
+ " domain = \"ust\";\n"
+ " tracer_name = \"lttng-ust\";\n"
+ " tracer_major = %u;\n"
+ " tracer_minor = %u;\n"
+ " tracer_patchlevel = %u;\n"
+ "};\n\n",
+ (int) getpid(),
+ procname,
+ LTTNG_UST_MAJOR_VERSION,
+ LTTNG_UST_MINOR_VERSION,
+ LTTNG_UST_PATCHLEVEL_VERSION
+ );
+ if (ret)
+ goto end;
+
ret = lttng_metadata_printf(session,
"clock {\n"
" name = %s;\n",
wildcard->enabled = 0;
return 0;
}
+
+/*
+ * Take the TLS "fault" in libuuid if dlopen'd, which can take the
+ * dynamic linker mutex, outside of the UST lock, since the UST lock is
+ * taken in constructors, which are called with dynamic linker mutex
+ * held.
+ */
+void lttng_fixup_event_tls(void)
+{
+ unsigned char uuid[37];
+
+ (void) uuid_generate(uuid);
+}