--- /dev/null
+#ifndef _LTT_MARKERS_H
+#define _LTT_MARKERS_H
+
+/*
+ * Marker support header.
+ *
+ * Mathieu Desnoyers, August 2007
+ * License: LGPL.
+ */
+
+#include <glib.h>
+#include <ltt/trace.h>
+#include <ltt/compiler.h>
+#include <ltt/marker-field.h>
+#include <ltt/trace.h>
+
+#define LTT_ATTRIBUTE_NETWORK_BYTE_ORDER (1<<1)
+
+/* static ids 0-7 reserved for internal use. */
+#define MARKER_CORE_IDS 8
+
+struct marker_info;
+
+struct marker_info {
+ GQuark name;
+ char *format;
+ long size; /* size if known statically, else -1 */
+ guint8 largest_align; /* Size of the largest alignment needed in the
+ payload. */
+ GArray *fields; /* Array of struct marker_field */
+ guint8 int_size, long_size, pointer_size, size_t_size;
+ guint8 alignment; /* Size on which the architecture alignment must be
+ done. Useful to encapsulate x86_32 events on
+ x86_64 kernels. */
+ struct marker_info *next; /* Linked list of markers with the same name */
+};
+
+struct marker_data {
+ GArray *markers; //indexed by marker id
+ GHashTable *markers_hash; //indexed by name hash
+ GHashTable *markers_format_hash; //indexed by name hash
+};
+
+enum marker_id {
+ MARKER_ID_SET_MARKER_ID = 0, /* Static IDs available (range 0-7) */
+ MARKER_ID_SET_MARKER_FORMAT,
+};
+
+static inline guint16 marker_get_id_from_info(struct marker_data *data,
+ struct marker_info *info)
+{
+ return ((unsigned long)info - (unsigned long)data->markers->data)
+ / sizeof(struct marker_info);
+}
+
+static inline struct marker_info *marker_get_info_from_id(
+ struct marker_data *data, guint16 id)
+{
+ if (unlikely(data->markers->len <= id))
+ return NULL;
+ return &g_array_index(data->markers, struct marker_info, id);
+}
+
+/*
+ * Returns the head of the marker info list for that name.
+ */
+static inline struct marker_info *marker_get_info_from_name(
+ struct marker_data *data, GQuark name)
+{
+ gpointer orig_key, value;
+ int res;
+
+ res = g_hash_table_lookup_extended(data->markers_hash,
+ (gconstpointer)(gulong)name, &orig_key, &value);
+ if (!res)
+ return NULL;
+ return marker_get_info_from_id(data, (guint16)(gulong)value);
+}
+
+static inline char *marker_get_format_from_name(struct marker_data *data,
+ GQuark name)
+{
+ gpointer orig_key, value;
+ int res;
+
+ res = g_hash_table_lookup_extended(data->markers_format_hash,
+ (gconstpointer)(gulong)name, &orig_key, &value);
+ if (!res)
+ return NULL;
+ return (char *)value;
+}
+
+static inline struct marker_field *marker_get_field(struct marker_info *info,
+ guint i)
+{
+ return &g_array_index(info->fields, struct marker_field, i);
+}
+
+static inline unsigned int marker_get_num_fields(struct marker_info *info)
+{
+ return info->fields->len;
+}
+
+/*
+ * for_each_marker_field - iterate over fields of a marker
+ * @field: struct marker_field * to use as iterator
+ * @info: marker info pointer
+ */
+#define for_each_marker_field(field, info) \
+ for (field = marker_get_field(info, 0); \
+ field != marker_get_field(info, marker_get_num_fields(info)); \
+ field++)
+
+int marker_format_event(LttTrace *trace, GQuark channel, GQuark name,
+ const char *format);
+int marker_id_event(LttTrace *trace, GQuark channel, GQuark name, guint16 id,
+ uint8_t int_size, uint8_t long_size, uint8_t pointer_size,
+ uint8_t size_t_size, uint8_t alignment);
+struct marker_data *allocate_marker_data(void);
+void destroy_marker_data(struct marker_data *data);
+
+#endif //_LTT_MARKERS_H