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