summaryrefslogtreecommitdiffstats
path: root/runtime/docs/html/map_8h-source.html
blob: 443fb9c9f9b793bc2e5030556784bf836e627d0a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
<title>SystemTap: map.h Source File</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
</head><body>
<!-- Generated by Doxygen 1.4.1 -->
<div class="qindex"><a class="qindex" href="index.html">Main&nbsp;Page</a> | <a class="qindex" href="annotated.html">Data&nbsp;Structures</a> | <a class="qindex" href="dirs.html">Directories</a> | <a class="qindex" href="files.html">File&nbsp;List</a> | <a class="qindex" href="functions.html">Data&nbsp;Fields</a> | <a class="qindex" href="globals.html">Globals</a> | <a class="qindex" href="pages.html">Related&nbsp;Pages</a></div>
<h1>map.h</h1><a href="map_8h.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment">00001 <span class="comment">/* -*- linux-c -*- */</span><span class="comment"></span>
00002 <span class="comment">/** @file map.h</span>
00003 <span class="comment"> * @brief Header file for maps and lists</span>
00004 <span class="comment"> */</span>
00005 
00006 <span class="preprocessor">#include &lt;linux/types.h&gt;</span>
00007 <span class="comment"></span>
00008 <span class="comment">/** Statistics are stored in this struct</span>
00009 <span class="comment">*/</span>
<a name="l00010"></a><a class="code" href="structstat.html">00010</a> <span class="keyword">typedef</span> <span class="keyword">struct </span>{
00011         int64_t count;
00012         int64_t sum;
00013         int64_t min, max;
00014         int64_t histogram[BUCKETS];
00015 } <a class="code" href="structstat.html">stat</a>;
00016 <span class="comment"></span>
00017 <span class="comment">/** Keys are either longs or char *</span>
00018 <span class="comment"> */</span>
<a name="l00019"></a><a class="code" href="unionkey__data.html">00019</a> <span class="keyword">union </span><a class="code" href="unionkey__data.html">key_data</a> {
00020         <span class="keywordtype">long</span> val;
00021         <span class="keywordtype">char</span> *str;
00022 };
00023 
00024 <span class="keyword">enum</span> keytype { NONE, LONG, STR } __attribute__ ((packed));
00025 <span class="keyword">enum</span> valtype { INT64, STAT, STRING, END };
00026 <span class="comment"></span>
00027 <span class="comment">/** all map nodes have the following structure </span>
00028 <span class="comment">*/</span>
<a name="l00029"></a><a class="code" href="structmap__node.html">00029</a> <span class="keyword">struct </span><a class="code" href="structmap__node.html">map_node</a> {
00030         <span class="keyword">struct </span>list_head lnode;
00031         <span class="keyword">struct </span>hlist_node hnode;
00032         <span class="keyword">union </span><a class="code" href="unionkey__data.html">key_data</a> key1;
00033         <span class="keyword">union </span><a class="code" href="unionkey__data.html">key_data</a> key2;
00034         <span class="keyword">enum</span> keytype key1type;
00035         <span class="keyword">enum</span> keytype key2type;
00036 };
00037 
00038 <span class="comment">/* specific map nodes with data attached */</span>
00039 <span class="keyword">struct </span>map_node_int64 {
00040         <span class="keyword">struct </span><a class="code" href="structmap__node.html">map_node</a> n;
00041         int64_t val;
00042 };
00043 
00044 <span class="keyword">struct </span>map_node_str {
00045         <span class="keyword">struct </span><a class="code" href="structmap__node.html">map_node</a> n;
00046         <span class="keywordtype">char</span> *str;
00047 };
00048 
00049 <span class="keyword">struct </span>map_node_stat {
00050         <span class="keyword">struct </span><a class="code" href="structmap__node.html">map_node</a> n;
00051         <a class="code" href="structstat.html">stat</a> stats;
00052 };
00053 <span class="comment"></span>
00054 <span class="comment">/** This structure contains all information about a map.</span>
00055 <span class="comment"> * It is allocated once when _stp_map_new() is called.</span>
00056 <span class="comment"> */</span>
<a name="l00057"></a><a class="code" href="structmap__root.html">00057</a> <span class="keyword">struct </span><a class="code" href="structmap__root.html">map_root</a> {
00058         <span class="keyword">enum</span> valtype type;  <span class="comment">/** type of the values stored in the array */</span>
<a name="l00059"></a><a class="code" href="structmap__root.html#o1">00059</a>         <span class="keywordtype">int</span> <a class="code" href="structmap__root.html#o1">maxnum</a>;     <span class="comment">/** maximum number of elements allowed in the array. */</span>
00060 
00061         <span class="comment">/* current number of elements */</span>
<a name="l00062"></a><a class="code" href="structmap__root.html#o2">00062</a>         <span class="keywordtype">int</span> <a class="code" href="structmap__root.html#o2">num</a>;
00063 
00064         <span class="comment">/* when more than maxnum elements, wrap or discard */</span>
00065         <span class="keywordtype">int</span> no_wrap;
00066 
00067         <span class="comment">/* linked list of current entries */</span>
00068         <span class="keyword">struct </span>list_head head;
00069 
00070         <span class="comment">/* pool of unused entries.  Used only when entries are statically allocated */</span>
00071         <span class="comment">/* at startup. */</span>
00072         <span class="keyword">struct </span>list_head pool;
00073 
00074         <span class="comment">/* saved key entry for lookups */</span>
00075         <span class="keyword">struct </span><a class="code" href="structmap__node.html">map_node</a> *key;
00076 
00077         <span class="comment">/* this is the creation data saved between the key functions and the */</span>
00078         <span class="comment">/* set/get functions */</span>
00079         u_int8_t create;
00080         <span class="keyword">enum</span> keytype c_key1type;
00081         <span class="keyword">enum</span> keytype c_key2type;
00082         <span class="keyword">struct </span>hlist_head *c_keyhead;
00083         <span class="keyword">union </span><a class="code" href="unionkey__data.html">key_data</a> c_key1;
00084         <span class="keyword">union </span><a class="code" href="unionkey__data.html">key_data</a> c_key2;
00085 
00086         <span class="comment">/* the hash table for this array */</span>
00087         <span class="keyword">struct </span>hlist_head hashes[HASH_TABLE_SIZE];
00088 
00089         <span class="comment">/* pointer to allocated memory space */</span>
00090         <span class="keywordtype">void</span> *membuf;
00091 };
00092 <span class="comment"></span>
00093 <span class="comment">/** All maps are of this type.</span>
00094 <span class="comment"> */</span>
<a name="l00095"></a><a class="code" href="map_8h.html#a10">00095</a> <span class="keyword">typedef</span> <span class="keyword">struct </span><a class="code" href="structmap__root.html">map_root</a> *<a class="code" href="structmap__root.html">MAP</a>;
00096 
00097 <span class="preprocessor">#define key1str(ptr) (ptr-&gt;n.key1.str)</span>
00098 <span class="preprocessor"></span><span class="preprocessor">#define key2str(ptr) (ptr-&gt;n.key2.str)</span>
00099 <span class="preprocessor"></span><span class="preprocessor">#define key1int(ptr) (ptr-&gt;n.key1.val)</span>
00100 <span class="preprocessor"></span><span class="preprocessor">#define key2int(ptr) (ptr-&gt;n.key2.val)</span>
00101 <span class="preprocessor"></span>
00102 <span class="preprocessor">#define _stp_map_key2(map, key1, key2)                          \</span>
00103 <span class="preprocessor">  ({                                                            \</span>
00104 <span class="preprocessor">    if (__builtin_types_compatible_p (typeof (key1), char[]))   \</span>
00105 <span class="preprocessor">      if (__builtin_types_compatible_p (typeof (key2), char[])) \</span>
00106 <span class="preprocessor">        _stp_map_key_str_str (map, (char *)(key1), (char *)(key2));     \</span>
00107 <span class="preprocessor">      else                                                      \</span>
00108 <span class="preprocessor">        _stp_map_key_str_long (map, (char *)(key1), (long)(key2));      \</span>
00109 <span class="preprocessor">    else                                                        \</span>
00110 <span class="preprocessor">      if (__builtin_types_compatible_p (typeof (key2), char[])) \</span>
00111 <span class="preprocessor">        _stp_map_key_long_str (map, (long)(key1), (char *)(key2));      \</span>
00112 <span class="preprocessor">      else                                                      \</span>
00113 <span class="preprocessor">        _stp_map_key_long_long (map, (long)(key1), (long)(key2));       \</span>
00114 <span class="preprocessor">  })</span>
00115 <span class="preprocessor"></span>
00116 <span class="preprocessor">#define _stp_map_key(map, key)                          \</span>
00117 <span class="preprocessor">  ({                                                            \</span>
00118 <span class="preprocessor">    if (__builtin_types_compatible_p (typeof (key), char[]))    \</span>
00119 <span class="preprocessor">      _stp_map_key_str (map, (char *)(key));                            \</span>
00120 <span class="preprocessor">    else                                                        \</span>
00121 <span class="preprocessor">      _stp_map_key_long (map, (long)(key));                             \</span>
00122 <span class="preprocessor">  })</span>
00123 <span class="preprocessor"></span>
00124 <span class="preprocessor">#define _stp_map_set(map, val)                          \</span>
00125 <span class="preprocessor">  ({                                                            \</span>
00126 <span class="preprocessor">    if (__builtin_types_compatible_p (typeof (val), char[]))    \</span>
00127 <span class="preprocessor">      _stp_map_set_str (map, (char *)(val));                            \</span>
00128 <span class="preprocessor">    else                                                        \</span>
00129 <span class="preprocessor">      _stp_map_set_int64 (map, (int64_t)(val));                 \</span>
00130 <span class="preprocessor">  })</span>
00131 <span class="preprocessor"></span>
00132 <span class="preprocessor">#define _stp_list_add(map, val)                         \</span>
00133 <span class="preprocessor">  ({                                                            \</span>
00134 <span class="preprocessor">    if (__builtin_types_compatible_p (typeof (val), char[]))    \</span>
00135 <span class="preprocessor">      _stp_list_add_str (map, (char *)(val));                           \</span>
00136 <span class="preprocessor">    else                                                        \</span>
00137 <span class="preprocessor">      _stp_list_add_int64 (map, (int64_t)(val));                        \</span>
00138 <span class="preprocessor">  })</span>
00139 <span class="preprocessor"></span>
00140 <span class="comment"></span>
00141 <span class="comment">/** Loop through all elements of a map.</span>
00142 <span class="comment"> * @param map </span>
00143 <span class="comment"> * @param ptr pointer to a map_node_stat, map_node_int64 or map_node_str</span>
00144 <span class="comment"> *</span>
00145 <span class="comment"> * @b Example:</span>
00146 <span class="comment"> * @include foreach.c</span>
00147 <span class="comment"> */</span>
00148 
<a name="l00149"></a><a class="code" href="map_8h.html#a8">00149</a> <span class="preprocessor">#define foreach(map, ptr)                               \</span>
00150 <span class="preprocessor">  for (ptr = (typeof(ptr))_stp_map_start(map); ptr; \</span>
00151 <span class="preprocessor">       ptr = (typeof(ptr))_stp_map_iter (map, (struct map_node *)ptr))</span>
00152 <span class="preprocessor"></span>
</pre></div><hr size="1"><address style="align: right;"><small>
Generated on Tue Mar 22 00:32:02 2005 for SystemTap.</small></body>
</html>