#include <urcu/list.h>
#include <urcu/hlist.h>
-#include <uuid/uuid.h>
#include <stdint.h>
#include <lttng/ust-abi.h>
#include <lttng/ust-tracer.h>
-#include <endian.h>
+#include <lttng/ust-endian.h>
#include <float.h>
+#define LTTNG_UST_UUID_LEN 16
+
struct ltt_channel;
struct ltt_session;
struct lttng_ust_lib_ring_buffer_ctx;
+ /*
+ * Data structures used by tracepoint event declarations, and by the
+ * tracer. Those structures have padding for future extension.
+ */
+
/*
* LTTng client type enumeration. Used by the consumer to map the
* callbacks from its own address space.
NR_STRING_ENCODINGS,
};
+ #define LTTNG_UST_ENUM_ENTRY_PADDING 16
struct lttng_enum_entry {
unsigned long long start, end; /* start and end are inclusive */
const char *string;
+ char padding[LTTNG_UST_ENUM_ENTRY_PADDING];
};
#define __type_integer(_type, _byte_order, _base, _encoding) \
.size = sizeof(_type) * CHAR_BIT, \
.alignment = lttng_alignof(_type) * CHAR_BIT, \
.signedness = lttng_is_signed_type(_type), \
- .reverse_byte_order = _byte_order != __BYTE_ORDER, \
+ .reverse_byte_order = _byte_order != BYTE_ORDER, \
.base = _base, \
.encoding = lttng_encode_##_encoding, \
}, \
} \
+ #define LTTNG_UST_INTEGER_TYPE_PADDING 24
struct lttng_integer_type {
unsigned int size; /* in bits */
unsigned short alignment; /* in bits */
unsigned int reverse_byte_order:1;
unsigned int base; /* 2, 8, 10, 16, for pretty print */
enum lttng_string_encodings encoding;
+ char padding[LTTNG_UST_INTEGER_TYPE_PADDING];
};
/*
- _float_mant_dig(_type), \
.mant_dig = _float_mant_dig(_type), \
.alignment = lttng_alignof(_type) * CHAR_BIT, \
- .reverse_byte_order = __BYTE_ORDER != __FLOAT_WORD_ORDER, \
+ .reverse_byte_order = BYTE_ORDER != FLOAT_WORD_ORDER, \
}, \
} \
+ #define LTTNG_UST_FLOAT_TYPE_PADDING 24
struct lttng_float_type {
unsigned int exp_dig; /* exponent digits, in bits */
unsigned int mant_dig; /* mantissa digits, in bits */
unsigned short alignment; /* in bits */
unsigned int reverse_byte_order:1;
+ char padding[LTTNG_UST_FLOAT_TYPE_PADDING];
};
+ #define LTTNG_UST_BASIC_TYPE_PADDING 128
union _lttng_basic_type {
struct lttng_integer_type integer;
struct {
enum lttng_string_encodings encoding;
} string;
struct lttng_float_type _float;
+ char padding[LTTNG_UST_BASIC_TYPE_PADDING];
};
struct lttng_basic_type {
} u;
};
+ #define LTTNG_UST_TYPE_PADDING 128
struct lttng_type {
enum abstract_types atype;
union {
struct lttng_basic_type length_type;
struct lttng_basic_type elem_type;
} sequence;
+ char padding[LTTNG_UST_TYPE_PADDING];
} u;
};
+ #define LTTNG_UST_ENUM_TYPE_PADDING 24
struct lttng_enum {
const char *name;
struct lttng_type container_type;
const struct lttng_enum_entry *entries;
unsigned int len;
+ char padding[LTTNG_UST_ENUM_TYPE_PADDING];
};
/* Event field description */
+ #define LTTNG_UST_EVENT_FIELD_PADDING 32
struct lttng_event_field {
const char *name;
struct lttng_type type;
+ char padding[LTTNG_UST_EVENT_FIELD_PADDING];
};
+ #define LTTNG_UST_CTX_FIELD_PADDING 40
struct lttng_ctx_field {
struct lttng_event_field event_field;
size_t (*get_size)(size_t offset);
struct lttng_ust_lib_ring_buffer_ctx *ctx,
struct ltt_channel *chan);
union {
+ char padding[LTTNG_UST_CTX_FIELD_PADDING];
} u;
void (*destroy)(struct lttng_ctx_field *field);
};
+ #define LTTNG_UST_CTX_PADDING 24
struct lttng_ctx {
struct lttng_ctx_field *fields;
unsigned int nr_fields;
unsigned int allocated_fields;
+ char padding[LTTNG_UST_CTX_PADDING];
+ };
+
+ #define LTTNG_UST_EVENT_DESC_PADDING 40
+ struct lttng_event_desc {
+ const char *name;
+ void *probe_callback;
+ const struct lttng_event_ctx *ctx; /* context */
+ const struct lttng_event_field *fields; /* event payload */
+ unsigned int nr_fields;
+ const int **loglevel;
+ const char *signature; /* Argument types/names received */
+ char padding[LTTNG_UST_EVENT_DESC_PADDING];
+ };
+
+ #define LTTNG_UST_PROBE_DESC_PADDING 40
+ struct lttng_probe_desc {
+ const char *provider;
+ const struct lttng_event_desc **event_desc;
+ unsigned int nr_events;
+ struct cds_list_head head; /* chain registered probes */
+ char padding[LTTNG_UST_PROBE_DESC_PADDING];
};
+ /* Data structures used by the tracer. */
+
/*
* Entry describing a per-session active wildcard, along with the event
* attribute and channel information configuring the events that need to
char name[0];
};
- struct lttng_event_desc {
- const char *name;
- void *probe_callback;
- const struct lttng_event_ctx *ctx; /* context */
- const struct lttng_event_field *fields; /* event payload */
- unsigned int nr_fields;
- const int **loglevel;
- };
-
- struct lttng_probe_desc {
- const char *provider;
- const struct lttng_event_desc **event_desc;
- unsigned int nr_events;
- struct cds_list_head head; /* chain registered probes */
- };
-
struct tp_list_entry {
struct lttng_ust_tracepoint_iter tp;
struct cds_list_head head;
/* Channel ID, available for consumer too */
unsigned int id;
/* Copy of session UUID for consumer (availability through shm) */
- uuid_t uuid; /* Trace session unique ID */
+ unsigned char uuid[LTTNG_UST_UUID_LEN]; /* Trace session unique ID */
};
struct ltt_session {
struct cds_list_head wildcards; /* Wildcard list head */
struct cds_list_head list; /* Session list */
unsigned int free_chan_id; /* Next chan ID to allocate */
- uuid_t uuid; /* Trace session unique ID */
+ unsigned char uuid[LTTNG_UST_UUID_LEN]; /* Trace session unique ID */
unsigned int metadata_dumped:1;
};
#define _GNU_SOURCE
#include <stdio.h>
-#include <endian.h>
#include <urcu/list.h>
#include <urcu/hlist.h>
#include <pthread.h>
-#include <uuid/uuid.h>
#include <errno.h>
#include <sys/shm.h>
#include <sys/ipc.h>
#include <stddef.h>
#include <inttypes.h>
#include <time.h>
-#include <sys/prctl.h>
+#include <lttng/ust-endian.h>
#include "clock.h"
#include <urcu-bp.h>
#include <usterr-signal-safe.h>
#include <helper.h>
#include "error.h"
+#include "compat.h"
+#include "lttng-ust-uuid.h"
#include "tracepoint-internal.h"
#include "ltt-tracer.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++;
struct ltt_session *ltt_session_create(void)
{
struct ltt_session *session;
+ int ret;
session = zmalloc(sizeof(struct ltt_session));
if (!session)
CDS_INIT_LIST_HEAD(&session->chan);
CDS_INIT_LIST_HEAD(&session->events);
CDS_INIT_LIST_HEAD(&session->wildcards);
- uuid_generate(session->uuid);
+ ret = lttng_ust_uuid_generate(session->uuid);
+ if (ret != 0) {
+ session->uuid[0] = '\0';
+ }
cds_list_add(&session->list, &sessions);
return session;
}
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++;
int _ltt_session_metadata_statedump(struct ltt_session *session)
{
unsigned char *uuid_c = session->uuid;
- char uuid_s[37], clock_uuid_s[CLOCK_UUID_LEN];
+ char uuid_s[LTTNG_UST_UUID_STR_LEN],
+ clock_uuid_s[LTTNG_UST_UUID_STR_LEN];
struct ltt_channel *chan;
struct ltt_event *event;
int ret = 0;
- char procname[PROCNAME_LEN] = "";
+ char procname[LTTNG_UST_PROCNAME_LEN] = "";
if (!CMM_ACCESS_ONCE(session->active))
return 0;
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';
+ lttng_ust_getprocname(procname);
+ procname[LTTNG_UST_PROCNAME_LEN - 1] = '\0';
ret = lttng_metadata_printf(session,
"env {\n"
" vpid = %d;\n"
*/
void lttng_fixup_event_tls(void)
{
- unsigned char uuid[37];
+ unsigned char uuid[LTTNG_UST_UUID_STR_LEN];
- (void) uuid_generate(uuid);
+ (void) lttng_ust_uuid_generate(uuid);
}