*/
#include <linux/list.h>
+#include <linux/uuid.h>
#include "ltt-debugfs-abi.h"
struct ltt_channel;
const char *string;
};
-struct lttng_enum {
- const struct lttng_enum_entry *entries;
- unsigned int len;
+#define __type_integer(_type, _byte_order) \
+ { \
+ .atype = atype_integer, \
+ .u.basic.integer = \
+ { \
+ .size = sizeof(_type), \
+ .alignment = ltt_alignof(_type) * CHAR_BIT, \
+ .signedness = is_signed_type(_type), \
+ .reverse_byte_order = _byte_order != __BYTE_ORDER, \
+ }, \
+ } \
+
+struct lttng_integer_type {
+ unsigned int size; /* in bits */
+ unsigned short alignment; /* in bits */
+ unsigned int signedness:1;
+ unsigned int reverse_byte_order:1;
+};
+
+union _lttng_basic_type {
+ struct lttng_integer_type integer;
+ struct {
+ const char *name;
+ } enumeration;
+ struct {
+ enum lttng_string_encodings encoding;
+ } string;
+};
+
+struct lttng_basic_type {
+ enum abstract_types atype;
+ union {
+ union _lttng_basic_type basic;
+ } u;
};
struct lttng_type {
enum abstract_types atype;
- const char *name;
union {
+ union _lttng_basic_type basic;
struct {
- unsigned int size; /* in bits */
- unsigned short alignment; /* in bits */
- unsigned int signedness:1;
- unsigned int reverse_byte_order:1;
- } integer;
- struct {
- const char *parent_type;
- const struct lttng_enum def;
- } enumeration;
- struct {
- const char *elem_type;
+ struct lttng_basic_type elem_type;
unsigned int length; /* num. elems. */
} array;
struct {
- const char *elem_type;
- const char *length_type;
+ struct lttng_basic_type length_type;
+ struct lttng_basic_type elem_type;
} sequence;
- struct {
- enum lttng_string_encodings encoding;
- } string;
} u;
-} __attribute__((packed));
+};
+
+struct lttng_enum {
+ const char *name;
+ struct lttng_type container_type;
+ const struct lttng_enum_entry *entries;
+ unsigned int len;
+};
/* Event field description */
void *filter;
enum instrum_type itype;
struct list_head list; /* Event list */
+ int metadata_dumped:1;
};
struct ltt_channel_ops {
void (*event_commit)(struct lib_ring_buffer_ctx *ctx);
void (*event_write)(struct lib_ring_buffer_ctx *ctx, const void *src,
size_t len);
+ /*
+ * packet_avail_size returns the available size in the current
+ * packet. Note that the size returned is only a hint, since it
+ * may change due to concurrent writes.
+ */
+ size_t (*packet_avail_size)(struct channel *chan);
+ wait_queue_head_t *(*get_reader_wait_queue)(struct ltt_channel *chan);
};
struct ltt_channel {
+ unsigned int id;
struct channel *chan; /* Channel buffers */
/* Event ID management */
struct ltt_session *session;
struct list_head list; /* Channel list */
wait_queue_head_t notify_wait; /* Channel addition notif. waitqueue */
struct ltt_channel_ops *ops;
+ int metadata_dumped:1;
+ int header_type:2; /* 0: unset, 1: compact, 2: large */
};
struct ltt_session {
int active; /* Is trace session active ? */
struct file *file; /* File associated to session */
+ struct ltt_channel *metadata; /* Metadata channel */
struct list_head chan; /* Channel list head */
struct list_head events; /* Event list head */
struct list_head list; /* Session list */
+ unsigned int free_chan_id; /* Next chan ID to allocate */
+ uuid_le uuid; /* Trace session unique ID */
+ int metadata_dumped:1;
};
struct ltt_transport {
void ltt_probe_unregister(struct lttng_probe_desc *desc);
const struct lttng_event_desc *ltt_event_get(const char *name);
void ltt_event_put(const struct lttng_event_desc *desc);
+int ltt_probes_init(void);
+void ltt_probes_exit(void);
#endif /* _LTT_EVENTS_H */