fix marker hash with array
[lttv.git] / ltt / branches / poly / ltt / marker.h
CommitLineData
3c165eaf 1#ifndef _LTT_MARKERS_H
2#define _LTT_MARKERS_H
3
d2007fbd 4/*
5 * Marker support header.
6 *
3c165eaf 7 * Mathieu Desnoyers, August 2007
d2007fbd 8 * License: LGPL.
9 */
10
3c165eaf 11#include <glib.h>
d2007fbd 12#include <ltt/trace.h>
13#include <ltt/compiler.h>
bb38a290 14#include <ltt/marker-field.h>
29af7cfd 15#include <ltt/trace.h>
3c165eaf 16
17#define LTT_ATTRIBUTE_COMPACT (1<<0)
18#define LTT_ATTRIBUTE_NETWORK_BYTE_ORDER (1<<1)
19
20/* static ids 0-7 reserved for internal use. */
21#define MARKER_CORE_IDS 8
22/* dynamic ids 8-127 reserved for compact events. */
23#define MARKER_COMPACT_IDS 128
24
25struct marker_info;
d2007fbd 26
27struct marker_info {
3c165eaf 28 GQuark name;
29 char *format;
30 long size; /* size if known statically, else -1 */
31 GArray *fields; /* Array of struct marker_field */
32 guint8 int_size, long_size, pointer_size, size_t_size, alignment;
33 struct marker_info *next; /* Linked list of markers with the same name */
34};
35
d2007fbd 36enum marker_id {
37 MARKER_ID_SET_MARKER_ID = 0, /* Static IDs available (range 0-7) */
38 MARKER_ID_SET_MARKER_FORMAT,
39 MARKER_ID_HEARTBEAT_32,
40 MARKER_ID_HEARTBEAT_64,
41 MARKER_ID_COMPACT, /* Compact IDs (range: 8-127) */
42 MARKER_ID_DYNAMIC, /* Dynamic IDs (range: 128-65535) */
43};
44
3c165eaf 45static inline guint16 marker_get_id_from_info(LttTrace *trace,
d2007fbd 46 struct marker_info *info)
47{
48 return ((unsigned long)info - (unsigned long)trace->markers->data)
49 / sizeof(struct marker_info);
50}
51
52static inline struct marker_info *marker_get_info_from_id(LttTrace *trace,
3c165eaf 53 guint16 id)
d2007fbd 54{
55 if (unlikely(trace->markers->len < id))
56 return NULL;
57 return &g_array_index(trace->markers, struct marker_info, id);
58}
59
3c165eaf 60/*
61 * Returns the head of the marker info list for that name.
62 */
63static inline struct marker_info *marker_get_info_from_name(LttTrace *trace,
64 GQuark name)
65{
abc34be7 66 gpointer orig_key, value;
67 guint16 id;
68 int res;
69
70 res = g_hash_table_lookup_extended(trace->markers_hash, (gconstpointer)name,
71 &orig_key, &value);
72 if (!res)
73 return NULL;
74 return marker_get_info_from_id(trace, (guint16)(gulong)value);
3c165eaf 75}
76
14b1ac27 77static inline struct marker_field *marker_get_field(struct marker_info *info,
78 guint i)
79{
80 return &g_array_index(info->fields, struct marker_field, i);
81}
82
83static inline unsigned int marker_get_num_fields(struct marker_info *info)
84{
85 return info->fields->len;
86}
87
88/*
89 * for_each_marker_field - iterate over fields of a marker
90 * @field: struct marker_field * to use as iterator
91 * @info: marker info pointer
92 */
93#define for_each_marker_field(field, info) \
94 for (field = marker_get_field(info, 0); \
95 field != marker_get_field(info, marker_get_num_fields(info)); \
96 field++)
97
3c165eaf 98int marker_format_event(LttTrace *trace, GQuark name, const char *format);
99int marker_id_event(LttTrace *trace, GQuark name, guint16 id,
100 uint8_t int_size, uint8_t long_size, uint8_t pointer_size,
101 uint8_t size_t_size, uint8_t alignment);
d2007fbd 102int allocate_marker_data(LttTrace *trace);
3c165eaf 103void destroy_marker_data(LttTrace *trace);
104
105#endif //_LTT_MARKERS_H
This page took 0.02765 seconds and 4 git commands to generate.