diff options
Diffstat (limited to 'runtime/docs/html/map_8c-source.html')
-rw-r--r-- | runtime/docs/html/map_8c-source.html | 661 |
1 files changed, 661 insertions, 0 deletions
diff --git a/runtime/docs/html/map_8c-source.html b/runtime/docs/html/map_8c-source.html new file mode 100644 index 00000000..301087fb --- /dev/null +++ b/runtime/docs/html/map_8c-source.html @@ -0,0 +1,661 @@ +<!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: SystemTap Runtime Library</title> +<link href="doxygen.css" rel="stylesheet" type="text/css"> +</head><body> +<div class="qindex"><a class="qindex" href="index.html">Intro</a> | <a class="qindex" href="globals_func.html">Functions</a> | <a class="qindex" href="globals_defs.html">Defines</a> | <a class="qindex" href="globals_enum.html">Enumerations</a> | <a class="qindex" href="globals_eval.html">Enumeration Values</a></div> + +<!-- Generated by Doxygen 1.3.9.1 --> +<h1>map.c</h1><a href="map_8c.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment">00001 <span class="comment">/* -*- linux-c -*- */</span> +00002 +00003 <span class="keyword">static</span> <span class="keywordtype">int</span> map_sizes[] = { +00004 <span class="keyword">sizeof</span>(<span class="keyword">struct </span><a class="code" href="structmap__node__int64.html">map_node_int64</a>), +00005 sizeof(struct map_node_stat), +00006 sizeof(struct map_node_str), +00007 0 +00008 }; +00009 +00010 <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">unsigned</span> string_hash(<span class="keyword">const</span> <span class="keywordtype">char</span> *key1, <span class="keyword">const</span> <span class="keywordtype">char</span> *key2) +00011 { +00012 <span class="keywordtype">int</span> hash = 0, count = 0; +00013 <span class="keywordtype">char</span> *v1 = (<span class="keywordtype">char</span> *)key1; +00014 <span class="keywordtype">char</span> *v2 = (<span class="keywordtype">char</span> *)key2; +00015 <span class="keywordflow">while</span> (*v1 && count++ < 5) { +00016 hash += *v1++; +00017 } +00018 <span class="keywordflow">while</span> (v2 && *v2 && count++ < 5) { +00019 hash += *v2++; +00020 } +00021 <span class="keywordflow">return</span> hash_long((<span class="keywordtype">unsigned</span> <span class="keywordtype">long</span>)hash, HASH_TABLE_BITS); +00022 } +00023 +00024 <span class="keyword">static</span> <span class="keyword">inline</span> <span class="keywordtype">unsigned</span> mixed_hash(<span class="keyword">const</span> <span class="keywordtype">char</span> *key1, <span class="keywordtype">long</span> key2) +00025 { +00026 <span class="keywordtype">int</span> hash = 0, count = 0; +00027 <span class="keywordtype">char</span> *v = (<span class="keywordtype">char</span> *)key1; +00028 <span class="keywordflow">while</span> (v && *v && count++ < 5) +00029 hash += *v++; +00030 <span class="keywordflow">return</span> hash_long((<span class="keywordtype">unsigned</span> <span class="keywordtype">long</span>)(hash ^ key2), HASH_TABLE_BITS); +00031 } +00032 +<a name="l00043"></a><a class="code" href="map_8c.html#a3">00043</a> <a class="code" href="structmap__root.html">MAP</a> <a class="code" href="map_8c.html#a3">_stp_map_new</a>(<span class="keywordtype">unsigned</span> max_entries, <span class="keyword">enum</span> valtype type) +00044 { +00045 size_t size; +00046 <a class="code" href="structmap__root.html">MAP</a> m = (<a class="code" href="structmap__root.html">MAP</a>) <a class="code" href="alloc_8h.html#a4">_stp_valloc</a>(<span class="keyword">sizeof</span>(<span class="keyword">struct</span> <a class="code" href="structmap__root.html">map_root</a>)); +00047 <span class="keywordflow">if</span> (m == NULL) +00048 <span class="keywordflow">return</span> NULL; +00049 +00050 INIT_LIST_HEAD(&m-><a class="code" href="structmap__root.html#o3">head</a>); +00051 +00052 m-><a class="code" href="structmap__root.html#o0">maxnum</a> = max_entries; +00053 m->type = type; +00054 <span class="keywordflow">if</span> (type >= END) { +00055 <a class="code" href="runtime_8h.html#a0">dbug</a> (<span class="stringliteral">"map_new: unknown type %d\n"</span>, type); +00056 <span class="keywordflow">return</span> NULL; +00057 } +00058 +00059 <span class="keywordflow">if</span> (max_entries) { +00060 <span class="keywordtype">void</span> *tmp; +00061 <span class="keywordtype">int</span> i; +00062 <span class="keyword">struct </span>list_head *e; +00063 +00064 INIT_LIST_HEAD(&m-><a class="code" href="structmap__root.html#o4">pool</a>); +00065 size = map_sizes[type]; +00066 tmp = <a class="code" href="alloc_8h.html#a4">_stp_valloc</a>(max_entries * size); +00067 +00068 <span class="keywordflow">for</span> (i = max_entries - 1; i >= 0; i--) { +00069 e = i * size + tmp; +00070 <a class="code" href="runtime_8h.html#a0">dbug</a> (<span class="stringliteral">"e=%lx\n"</span>, (<span class="keywordtype">long</span>)e); +00071 list_add(e, &m-><a class="code" href="structmap__root.html#o4">pool</a>); +00072 } +00073 m-><a class="code" href="structmap__root.html#o11">membuf</a> = tmp; +00074 } +00075 <span class="keywordflow">return</span> m; +00076 } +00077 +00078 <span class="keyword">static</span> <span class="keywordtype">void</span> map_free_strings(<a class="code" href="structmap__root.html">MAP</a> map, <span class="keyword">struct</span> <a class="code" href="structmap__node.html">map_node</a> *n) +00079 { +00080 <span class="keyword">struct </span>map_node_str *m = (<span class="keyword">struct </span>map_node_str *)n; +00081 <a class="code" href="runtime_8h.html#a0">dbug</a> (<span class="stringliteral">"n = %lx\n"</span>, (<span class="keywordtype">long</span>)n); +00082 <span class="keywordflow">if</span> (map->type == STRING) { +00083 <a class="code" href="runtime_8h.html#a0">dbug</a> (<span class="stringliteral">"val STRING %lx\n"</span>, (<span class="keywordtype">long</span>)m-><a class="code" href="structmap__node__str.html#o1">str</a>); +00084 <span class="keywordflow">if</span> (m-><a class="code" href="structmap__node__str.html#o1">str</a>) +00085 <a class="code" href="alloc_8h.html#a5">_stp_free</a>(m-><a class="code" href="structmap__node__str.html#o1">str</a>); +00086 } +00087 <span class="keywordflow">if</span> (m-><a class="code" href="structmap__node__str.html#o0">n</a>.key1type == STR) { +00088 <a class="code" href="runtime_8h.html#a0">dbug</a> (<span class="stringliteral">"key1 STR %lx\n"</span>, (<span class="keywordtype">long</span>)<a class="code" href="map_8h.html#a0">key1str</a>(m)); +00089 <span class="keywordflow">if</span> (<a class="code" href="map_8h.html#a0">key1str</a>(m)) +00090 <a class="code" href="alloc_8h.html#a5">_stp_free</a>(<a class="code" href="map_8h.html#a0">key1str</a>(m)); +00091 } +00092 <span class="keywordflow">if</span> (m-><a class="code" href="structmap__node__str.html#o0">n</a>.key2type == STR) { +00093 <a class="code" href="runtime_8h.html#a0">dbug</a> (<span class="stringliteral">"key2 STR %lx\n"</span>, (<span class="keywordtype">long</span>)<a class="code" href="map_8h.html#a1">key2str</a>(m)); +00094 <span class="keywordflow">if</span> (<a class="code" href="map_8h.html#a1">key2str</a>(m)) +00095 <a class="code" href="alloc_8h.html#a5">_stp_free</a>(<a class="code" href="map_8h.html#a1">key2str</a>(m)); +00096 } +00097 } +00098 +<a name="l00104"></a><a class="code" href="map_8c.html#a5">00104</a> <span class="keywordtype">void</span> <a class="code" href="map_8c.html#a5">_stp_map_key_del</a>(<a class="code" href="structmap__root.html">MAP</a> map) +00105 { +00106 <span class="keyword">struct </span><a class="code" href="structmap__node.html">map_node</a> *m; +00107 +00108 <a class="code" href="runtime_8h.html#a0">dbug</a> (<span class="stringliteral">"create=%d key=%lx\n"</span>, map-><a class="code" href="structmap__root.html#o6">create</a>, (<span class="keywordtype">long</span>)map-><a class="code" href="structmap__root.html#o5">key</a>); +00109 <span class="keywordflow">if</span> (map == NULL) +00110 <span class="keywordflow">return</span>; +00111 +00112 <span class="keywordflow">if</span> (map-><a class="code" href="structmap__root.html#o6">create</a>) { +00113 map-><a class="code" href="structmap__root.html#o6">create</a> = 0; +00114 map-><a class="code" href="structmap__root.html#o5">key</a> = NULL; +00115 <span class="keywordflow">return</span>; +00116 } +00117 +00118 <span class="keywordflow">if</span> (map-><a class="code" href="structmap__root.html#o5">key</a> == NULL) +00119 <span class="keywordflow">return</span>; +00120 +00121 m = (<span class="keyword">struct </span><a class="code" href="structmap__node.html">map_node</a> *)map-><a class="code" href="structmap__root.html#o5">key</a>; +00122 +00123 <span class="comment">/* remove node from old hash list */</span> +00124 hlist_del_init(&m-><a class="code" href="structmap__node.html#o1">hnode</a>); +00125 +00126 <span class="comment">/* remove from entry list */</span> +00127 list_del(&m-><a class="code" href="structmap__node.html#o0">lnode</a>); +00128 +00129 <span class="comment">/* remove any allocated string storage */</span> +00130 map_free_strings(map, (<span class="keyword">struct</span> <a class="code" href="structmap__node.html">map_node</a> *)map-><a class="code" href="structmap__root.html#o5">key</a>); +00131 +00132 <span class="keywordflow">if</span> (map-><a class="code" href="structmap__root.html#o0">maxnum</a>) +00133 list_add(&m-><a class="code" href="structmap__node.html#o0">lnode</a>, &map-><a class="code" href="structmap__root.html#o4">pool</a>); +00134 <span class="keywordflow">else</span> +00135 <a class="code" href="alloc_8h.html#a5">_stp_free</a>(m); +00136 +00137 map-><a class="code" href="structmap__root.html#o5">key</a> = NULL; +00138 map-><a class="code" href="structmap__root.html#o1">num</a>--; +00139 } +00140 +<a name="l00149"></a><a class="code" href="map_8c.html#a6">00149</a> <span class="keyword">struct </span><a class="code" href="structmap__node.html">map_node</a> *<a class="code" href="map_8c.html#a6">_stp_map_start</a>(<a class="code" href="structmap__root.html">MAP</a> map) +00150 { +00151 <span class="keywordflow">if</span> (map == NULL) +00152 <span class="keywordflow">return</span> NULL; +00153 +00154 <a class="code" href="runtime_8h.html#a0">dbug</a> (<span class="stringliteral">"%lx\n"</span>, (<span class="keywordtype">long</span>)map-><a class="code" href="structmap__root.html#o3">head</a>.next); +00155 +00156 <span class="keywordflow">if</span> (list_empty(&map-><a class="code" href="structmap__root.html#o3">head</a>)) +00157 <span class="keywordflow">return</span> NULL; +00158 +00159 <span class="keywordflow">return</span> (<span class="keyword">struct </span><a class="code" href="structmap__node.html">map_node</a> *)map-><a class="code" href="structmap__root.html#o3">head</a>.next; +00160 } +00161 +<a name="l00172"></a><a class="code" href="map_8c.html#a7">00172</a> <span class="keyword">struct </span><a class="code" href="structmap__node.html">map_node</a> *<a class="code" href="map_8c.html#a7">_stp_map_iter</a>(<a class="code" href="structmap__root.html">MAP</a> map, <span class="keyword">struct</span> <a class="code" href="structmap__node.html">map_node</a> *m) +00173 { +00174 <span class="keywordflow">if</span> (map == NULL) +00175 <span class="keywordflow">return</span> NULL; +00176 +00177 <a class="code" href="runtime_8h.html#a0">dbug</a> (<span class="stringliteral">"%lx next=%lx prev=%lx map->head.next=%lx\n"</span>, (<span class="keywordtype">long</span>)m, (<span class="keywordtype">long</span>)m-><a class="code" href="structmap__node.html#o0">lnode</a>.next, (<span class="keywordtype">long</span>)m-><a class="code" href="structmap__node.html#o0">lnode</a>.prev, (<span class="keywordtype">long</span>)map-><a class="code" href="structmap__root.html#o3">head</a>.next); +00178 +00179 <span class="keywordflow">if</span> (m->lnode.next == &map-><a class="code" href="structmap__root.html#o3">head</a>) +00180 <span class="keywordflow">return</span> NULL; +00181 +00182 <span class="keywordflow">return</span> (<span class="keyword">struct </span><a class="code" href="structmap__node.html">map_node</a> *)m-><a class="code" href="structmap__node.html#o0">lnode</a>.next; +00183 } +00184 +<a name="l00190"></a><a class="code" href="map_8c.html#a8">00190</a> <span class="keywordtype">void</span> <a class="code" href="map_8c.html#a8">_stp_map_del</a>(<a class="code" href="structmap__root.html">MAP</a> map) +00191 { +00192 <span class="keywordflow">if</span> (map == NULL) +00193 <span class="keywordflow">return</span>; +00194 +00195 <span class="keywordflow">if</span> (!list_empty(&map-><a class="code" href="structmap__root.html#o3">head</a>)) { +00196 <span class="keyword">struct </span><a class="code" href="structmap__node.html">map_node</a> *ptr = (<span class="keyword">struct </span><a class="code" href="structmap__node.html">map_node</a> *)map-><a class="code" href="structmap__root.html#o3">head</a>.next; +00197 <span class="keywordflow">while</span> (ptr && ptr != (<span class="keyword">struct </span><a class="code" href="structmap__node.html">map_node</a> *)&map-><a class="code" href="structmap__root.html#o3">head</a>) { +00198 map_free_strings(map, ptr); +00199 ptr = (<span class="keyword">struct </span><a class="code" href="structmap__node.html">map_node</a> *)ptr-><a class="code" href="structmap__node.html#o0">lnode</a>.next; +00200 } +00201 } +00202 <a class="code" href="alloc_8h.html#a6">_stp_vfree</a>(map-><a class="code" href="structmap__root.html#o11">membuf</a>); +00203 <a class="code" href="alloc_8h.html#a6">_stp_vfree</a>(map); +00204 } +00205 +00206 <span class="comment">/********************** KEY FUNCTIONS *********************/</span> +00207 +00208 +<a name="l00218"></a><a class="code" href="map_8c.html#a9">00218</a> <span class="keywordtype">void</span> <a class="code" href="map_8c.html#a9">_stp_map_key_long_long</a>(<a class="code" href="structmap__root.html">MAP</a> map, <span class="keywordtype">long</span> key1, <span class="keywordtype">long</span> key2) +00219 { +00220 <span class="keywordtype">unsigned</span> hv; +00221 <span class="keyword">struct </span>hlist_head *head; +00222 <span class="keyword">struct </span>hlist_node *e; +00223 +00224 <span class="keywordflow">if</span> (map == NULL) +00225 <span class="keywordflow">return</span>; +00226 +00227 hv = hash_long(key1 ^ key2, HASH_TABLE_BITS); +00228 head = &map-><a class="code" href="structmap__root.html#o10">hashes</a>[hv]; +00229 +00230 <a class="code" href="runtime_8h.html#a0">dbug</a> (<span class="stringliteral">"hash for %ld,%ld is %d\n"</span>, key1, key2, hv); +00231 +00232 hlist_for_each(e, head) { +00233 <span class="keyword">struct </span><a class="code" href="structmap__node.html">map_node</a> *n = +00234 (<span class="keyword">struct </span><a class="code" href="structmap__node.html">map_node</a> *)((long)e - <span class="keyword">sizeof</span>(<span class="keyword">struct </span>hlist_node)); +00235 <a class="code" href="runtime_8h.html#a0">dbug</a> (<span class="stringliteral">"n =%lx key=%ld,%ld\n"</span>, (<span class="keywordtype">long</span>)n, n-><a class="code" href="structmap__node.html#o2">key1</a>.<a class="code" href="unionkey__data.html#o0">val</a>, n->key2.<a class="code" href="unionkey__data.html#o0">val</a>); +00236 <span class="keywordflow">if</span> (key1 == n->key1.val && key2 == n->key2.val) { +00237 map-><a class="code" href="structmap__root.html#o5">key</a> = n; +00238 <a class="code" href="runtime_8h.html#a0">dbug</a> (<span class="stringliteral">"saving key %lx\n"</span>, (<span class="keywordtype">long</span>)map-><a class="code" href="structmap__root.html#o5">key</a>); +00239 map-><a class="code" href="structmap__root.html#o6">create</a> = 0; +00240 <span class="keywordflow">return</span>; +00241 } +00242 } +00243 +00244 map-><a class="code" href="structmap__root.html#o8">c_key1</a>.<a class="code" href="unionkey__data.html#o0">val</a> = key1; +00245 map-><a class="code" href="structmap__root.html#o9">c_key2</a>.<a class="code" href="unionkey__data.html#o0">val</a> = key2; +00246 map->c_key1type = LONG; +00247 map->c_key2type = LONG; +00248 map-><a class="code" href="structmap__root.html#o7">c_keyhead</a> = head; +00249 map-><a class="code" href="structmap__root.html#o6">create</a> = 1; +00250 } +00251 +<a name="l00261"></a><a class="code" href="map_8c.html#a10">00261</a> <span class="keywordtype">void</span> <a class="code" href="map_8c.html#a10">_stp_map_key_str_str</a>(<a class="code" href="structmap__root.html">MAP</a> map, <span class="keywordtype">char</span> *key1, <span class="keywordtype">char</span> *key2) +00262 { +00263 <span class="keywordtype">unsigned</span> hv; +00264 <span class="keyword">struct </span>hlist_head *head; +00265 <span class="keyword">struct </span>hlist_node *e; +00266 +00267 <span class="keywordflow">if</span> (map == NULL) +00268 <span class="keywordflow">return</span>; +00269 +00270 <span class="keywordflow">if</span> (key1 == NULL) { +00271 map-><a class="code" href="structmap__root.html#o5">key</a> = NULL; +00272 <span class="keywordflow">return</span>; +00273 } +00274 +00275 hv = string_hash(key1, key2); +00276 head = &map-><a class="code" href="structmap__root.html#o10">hashes</a>[hv]; +00277 +00278 <a class="code" href="runtime_8h.html#a0">dbug</a> (<span class="stringliteral">"hash for %s,%s is %d\n"</span>, key1, key2, hv); +00279 +00280 hlist_for_each(e, head) { +00281 <span class="keyword">struct </span><a class="code" href="structmap__node.html">map_node</a> *n = +00282 (<span class="keyword">struct </span><a class="code" href="structmap__node.html">map_node</a> *)((long)e - <span class="keyword">sizeof</span>(<span class="keyword">struct </span>hlist_node)); +00283 <a class="code" href="runtime_8h.html#a0">dbug</a> (<span class="stringliteral">"e =%lx key=%s,%s\n"</span>, (<span class="keywordtype">long</span>)e, n-><a class="code" href="structmap__node.html#o2">key1</a>.<a class="code" href="unionkey__data.html#o1">str</a>,n-><a class="code" href="structmap__node.html#o3">key2</a>.<a class="code" href="unionkey__data.html#o1">str</a>); +00284 <span class="keywordflow">if</span> (strcmp(key1, n-><a class="code" href="structmap__node.html#o2">key1</a>.<a class="code" href="unionkey__data.html#o1">str</a>) == 0 +00285 && (key2 == NULL || strcmp(key2, n-><a class="code" href="structmap__node.html#o3">key2</a>.<a class="code" href="unionkey__data.html#o1">str</a>) == 0)) { +00286 map-><a class="code" href="structmap__root.html#o5">key</a> = n; +00287 <a class="code" href="runtime_8h.html#a0">dbug</a> (<span class="stringliteral">"saving key %lx\n"</span>, (<span class="keywordtype">long</span>)map-><a class="code" href="structmap__root.html#o5">key</a>); +00288 map-><a class="code" href="structmap__root.html#o6">create</a> = 0; +00289 <span class="keywordflow">return</span>; +00290 } +00291 } +00292 +00293 map-><a class="code" href="structmap__root.html#o8">c_key1</a>.<a class="code" href="unionkey__data.html#o1">str</a> = key1; +00294 map-><a class="code" href="structmap__root.html#o9">c_key2</a>.<a class="code" href="unionkey__data.html#o1">str</a> = key2; +00295 map->c_key1type = STR; +00296 map->c_key2type = STR; +00297 map-><a class="code" href="structmap__root.html#o7">c_keyhead</a> = head; +00298 map-><a class="code" href="structmap__root.html#o6">create</a> = 1; +00299 } +00300 +<a name="l00310"></a><a class="code" href="map_8c.html#a11">00310</a> <span class="keywordtype">void</span> <a class="code" href="map_8c.html#a11">_stp_map_key_str_long</a>(<a class="code" href="structmap__root.html">MAP</a> map, <span class="keywordtype">char</span> *key1, <span class="keywordtype">long</span> key2) +00311 { +00312 <span class="keywordtype">unsigned</span> hv; +00313 <span class="keyword">struct </span>hlist_head *head; +00314 <span class="keyword">struct </span>hlist_node *e; +00315 +00316 <span class="keywordflow">if</span> (map == NULL) +00317 <span class="keywordflow">return</span>; +00318 +00319 <span class="keywordflow">if</span> (key1 == NULL) { +00320 map-><a class="code" href="structmap__root.html#o5">key</a> = NULL; +00321 <span class="keywordflow">return</span>; +00322 } +00323 +00324 hv = mixed_hash(key1, key2); +00325 head = &map-><a class="code" href="structmap__root.html#o10">hashes</a>[hv]; +00326 +00327 <a class="code" href="runtime_8h.html#a0">dbug</a> (<span class="stringliteral">"hash for %s,%ld is %d\n"</span>, key1, key2, hv); +00328 +00329 hlist_for_each(e, head) { +00330 <span class="keyword">struct </span><a class="code" href="structmap__node.html">map_node</a> *n = +00331 (<span class="keyword">struct </span><a class="code" href="structmap__node.html">map_node</a> *)((long)e - <span class="keyword">sizeof</span>(<span class="keyword">struct </span>hlist_node)); +00332 <a class="code" href="runtime_8h.html#a0">dbug</a> (<span class="stringliteral">"e =%lx key=%s,%ld\n"</span>, (<span class="keywordtype">long</span>)e, n-><a class="code" href="structmap__node.html#o2">key1</a>.<a class="code" href="unionkey__data.html#o1">str</a>,(<span class="keywordtype">long</span>)n-><a class="code" href="structmap__node.html#o3">key2</a>.<a class="code" href="unionkey__data.html#o0">val</a>); +00333 <span class="keywordflow">if</span> (strcmp(key1, n-><a class="code" href="structmap__node.html#o2">key1</a>.<a class="code" href="unionkey__data.html#o1">str</a>) == 0 && key2 == n-><a class="code" href="structmap__node.html#o3">key2</a>.<a class="code" href="unionkey__data.html#o0">val</a>) { +00334 map-><a class="code" href="structmap__root.html#o5">key</a> = n; +00335 <a class="code" href="runtime_8h.html#a0">dbug</a> (<span class="stringliteral">"saving key %lx\n"</span>, (<span class="keywordtype">long</span>)map-><a class="code" href="structmap__root.html#o5">key</a>); +00336 map-><a class="code" href="structmap__root.html#o6">create</a> = 0; +00337 <span class="keywordflow">return</span>; +00338 } +00339 } +00340 +00341 map-><a class="code" href="structmap__root.html#o8">c_key1</a>.<a class="code" href="unionkey__data.html#o1">str</a> = key1; +00342 map-><a class="code" href="structmap__root.html#o9">c_key2</a>.<a class="code" href="unionkey__data.html#o0">val</a> = key2; +00343 map->c_key1type = STR; +00344 map->c_key2type = LONG; +00345 map-><a class="code" href="structmap__root.html#o7">c_keyhead</a> = head; +00346 map-><a class="code" href="structmap__root.html#o6">create</a> = 1; +00347 } +00348 +<a name="l00358"></a><a class="code" href="map_8c.html#a12">00358</a> <span class="keywordtype">void</span> <a class="code" href="map_8c.html#a12">_stp_map_key_long_str</a>(<a class="code" href="structmap__root.html">MAP</a> map, <span class="keywordtype">long</span> key1, <span class="keywordtype">char</span> *key2) +00359 { +00360 <span class="keywordtype">unsigned</span> hv; +00361 <span class="keyword">struct </span>hlist_head *head; +00362 <span class="keyword">struct </span>hlist_node *e; +00363 +00364 <span class="keywordflow">if</span> (map == NULL) +00365 <span class="keywordflow">return</span>; +00366 +00367 hv = mixed_hash(key2, key1); +00368 head = &map-><a class="code" href="structmap__root.html#o10">hashes</a>[hv]; +00369 <a class="code" href="runtime_8h.html#a0">dbug</a> (<span class="stringliteral">"hash for %ld,%s is %d\n"</span>, key1, key2, hv); +00370 +00371 hlist_for_each(e, head) { +00372 <span class="keyword">struct </span><a class="code" href="structmap__node.html">map_node</a> *n = +00373 (<span class="keyword">struct </span><a class="code" href="structmap__node.html">map_node</a> *)((long)e - <span class="keyword">sizeof</span>(<span class="keyword">struct </span>hlist_node)); +00374 <a class="code" href="runtime_8h.html#a0">dbug</a> (<span class="stringliteral">"e =%lx key=%ld,%s\n"</span>, (<span class="keywordtype">long</span>)e, n-><a class="code" href="structmap__node.html#o2">key1</a>.<a class="code" href="unionkey__data.html#o0">val</a>,n-><a class="code" href="structmap__node.html#o3">key2</a>.<a class="code" href="unionkey__data.html#o1">str</a>); +00375 <span class="keywordflow">if</span> (key1 == n-><a class="code" href="structmap__node.html#o2">key1</a>.<a class="code" href="unionkey__data.html#o0">val</a> && strcmp(key2, n-><a class="code" href="structmap__node.html#o3">key2</a>.<a class="code" href="unionkey__data.html#o1">str</a>) == 0) { +00376 map-><a class="code" href="structmap__root.html#o5">key</a> = n; +00377 <a class="code" href="runtime_8h.html#a0">dbug</a> (<span class="stringliteral">"saving key %lx\n"</span>, (<span class="keywordtype">long</span>)map-><a class="code" href="structmap__root.html#o5">key</a>); +00378 map-><a class="code" href="structmap__root.html#o6">create</a> = 0; +00379 <span class="keywordflow">return</span>; +00380 } +00381 } +00382 +00383 map-><a class="code" href="structmap__root.html#o8">c_key1</a>.<a class="code" href="unionkey__data.html#o0">val</a> = key1; +00384 map-><a class="code" href="structmap__root.html#o9">c_key2</a>.<a class="code" href="unionkey__data.html#o1">str</a> = key2; +00385 map->c_key1type = LONG; +00386 map->c_key2type = STR; +00387 map-><a class="code" href="structmap__root.html#o7">c_keyhead</a> = head; +00388 map-><a class="code" href="structmap__root.html#o6">create</a> = 1; +00389 } +00390 +<a name="l00399"></a><a class="code" href="map_8c.html#a13">00399</a> <span class="keywordtype">void</span> <a class="code" href="map_8c.html#a13">_stp_map_key_str</a>(<a class="code" href="structmap__root.html">MAP</a> map, <span class="keywordtype">char</span> *key) +00400 { +00401 <span class="keywordflow">if</span> (map == NULL) +00402 <span class="keywordflow">return</span>; +00403 <a class="code" href="map_8c.html#a10">_stp_map_key_str_str</a>(map, key, NULL); +00404 map->c_key2type = NONE; +00405 } +00406 +<a name="l00415"></a><a class="code" href="map_8c.html#a14">00415</a> <span class="keywordtype">void</span> <a class="code" href="map_8c.html#a14">_stp_map_key_long</a>(<a class="code" href="structmap__root.html">MAP</a> map, <span class="keywordtype">long</span> key) +00416 { +00417 <span class="keywordflow">if</span> (map == NULL) +00418 <span class="keywordflow">return</span>; +00419 <a class="code" href="map_8c.html#a9">_stp_map_key_long_long</a>(map, key, 0); +00420 map->c_key2type = NONE; +00421 } +00422 +00423 <span class="comment">/********************** SET/GET VALUES *********************/</span> +00424 +00425 <span class="keyword">static</span> <span class="keywordtype">void</span> map_copy_keys(<a class="code" href="structmap__root.html">MAP</a> map, <span class="keyword">struct</span> <a class="code" href="structmap__node.html">map_node</a> *m) +00426 { +00427 m->key1type = map->c_key1type; +00428 m->key2type = map->c_key2type; +00429 <span class="keywordflow">switch</span> (map->c_key1type) { +00430 <span class="keywordflow">case</span> <a class="code" href="map_8h.html#a18a13">STR</a>: +00431 m-><a class="code" href="structmap__node.html#o2">key1</a>.<a class="code" href="unionkey__data.html#o1">str</a> = <a class="code" href="alloc_8h.html#a2">_stp_alloc</a>(strlen(map-><a class="code" href="structmap__root.html#o8">c_key1</a>.<a class="code" href="unionkey__data.html#o1">str</a>) + 1); +00432 strcpy(m-><a class="code" href="structmap__node.html#o2">key1</a>.<a class="code" href="unionkey__data.html#o1">str</a>, map-><a class="code" href="structmap__root.html#o8">c_key1</a>.<a class="code" href="unionkey__data.html#o1">str</a>); +00433 <span class="keywordflow">break</span>; +00434 <span class="keywordflow">case</span> <a class="code" href="map_8h.html#a18a12">LONG</a>: +00435 m-><a class="code" href="structmap__node.html#o2">key1</a>.<a class="code" href="unionkey__data.html#o0">val</a> = map-><a class="code" href="structmap__root.html#o8">c_key1</a>.<a class="code" href="unionkey__data.html#o0">val</a>; +00436 <span class="keywordflow">break</span>; +00437 <span class="keywordflow">case</span> <a class="code" href="map_8h.html#a18a11">NONE</a>: +00438 <span class="comment">/* ERROR */</span> +00439 <span class="keywordflow">break</span>; +00440 } +00441 <span class="keywordflow">switch</span> (map->c_key2type) { +00442 <span class="keywordflow">case</span> <a class="code" href="map_8h.html#a18a13">STR</a>: +00443 m-><a class="code" href="structmap__node.html#o3">key2</a>.<a class="code" href="unionkey__data.html#o1">str</a> = <a class="code" href="alloc_8h.html#a2">_stp_alloc</a>(strlen(map-><a class="code" href="structmap__root.html#o9">c_key2</a>.<a class="code" href="unionkey__data.html#o1">str</a>) + 1); +00444 strcpy(m-><a class="code" href="structmap__node.html#o3">key2</a>.<a class="code" href="unionkey__data.html#o1">str</a>, map-><a class="code" href="structmap__root.html#o9">c_key2</a>.<a class="code" href="unionkey__data.html#o1">str</a>); +00445 <span class="keywordflow">break</span>; +00446 <span class="keywordflow">case</span> <a class="code" href="map_8h.html#a18a12">LONG</a>: +00447 m-><a class="code" href="structmap__node.html#o3">key2</a>.<a class="code" href="unionkey__data.html#o0">val</a> = map-><a class="code" href="structmap__root.html#o9">c_key2</a>.<a class="code" href="unionkey__data.html#o0">val</a>; +00448 <span class="keywordflow">break</span>; +00449 <span class="keywordflow">case</span> <a class="code" href="map_8h.html#a18a11">NONE</a>: +00450 <span class="keywordflow">break</span>; +00451 } +00452 +00453 <span class="comment">/* add node to new hash list */</span> +00454 hlist_add_head(&m-><a class="code" href="structmap__node.html#o1">hnode</a>, map-><a class="code" href="structmap__root.html#o7">c_keyhead</a>); +00455 +00456 map-><a class="code" href="structmap__root.html#o5">key</a> = m; +00457 map-><a class="code" href="structmap__root.html#o6">create</a> = 0; +00458 map-><a class="code" href="structmap__root.html#o1">num</a>++; +00459 } +00460 +<a name="l00471"></a><a class="code" href="map_8c.html#a16">00471</a> <span class="keywordtype">void</span> <a class="code" href="map_8c.html#a16">_stp_map_set_int64</a>(<a class="code" href="structmap__root.html">MAP</a> map, int64_t val) +00472 { +00473 <span class="keyword">struct </span><a class="code" href="structmap__node__int64.html">map_node_int64</a> *m; +00474 +00475 <span class="keywordflow">if</span> (map == NULL) +00476 <span class="keywordflow">return</span>; +00477 +00478 <span class="keywordflow">if</span> (map-><a class="code" href="structmap__root.html#o6">create</a>) { +00479 <span class="keywordflow">if</span> (val == 0) +00480 <span class="keywordflow">return</span>; +00481 +00482 <span class="keywordflow">if</span> (map-><a class="code" href="structmap__root.html#o0">maxnum</a>) { +00483 <span class="keywordflow">if</span> (list_empty(&map-><a class="code" href="structmap__root.html#o4">pool</a>)) { +00484 <span class="keywordflow">if</span> (map-><a class="code" href="structmap__root.html#o2">no_wrap</a>) { +00485 <span class="comment">/* ERROR. FIXME */</span> +00486 <span class="keywordflow">return</span>; +00487 } +00488 m = (<span class="keyword">struct </span><a class="code" href="structmap__node__int64.html">map_node_int64</a> *)map-><a class="code" href="structmap__root.html#o3">head</a>.next; +00489 hlist_del_init(&m-><a class="code" href="structmap__node__int64.html#o0">n</a>.<a class="code" href="structmap__node.html#o1">hnode</a>); +00490 map_free_strings(map, (<span class="keyword">struct</span> <a class="code" href="structmap__node.html">map_node</a> *)m); +00491 <a class="code" href="runtime_8h.html#a0">dbug</a> (<span class="stringliteral">"got %lx off head\n"</span>, (<span class="keywordtype">long</span>)m); +00492 } <span class="keywordflow">else</span> { +00493 m = (<span class="keyword">struct </span><a class="code" href="structmap__node__int64.html">map_node_int64</a> *)map-><a class="code" href="structmap__root.html#o4">pool</a>.next; +00494 <a class="code" href="runtime_8h.html#a0">dbug</a> (<span class="stringliteral">"got %lx off pool\n"</span>, (<span class="keywordtype">long</span>)m); +00495 } +00496 list_move_tail(&m-><a class="code" href="structmap__node__int64.html#o0">n</a>.<a class="code" href="structmap__node.html#o0">lnode</a>, &map-><a class="code" href="structmap__root.html#o3">head</a>); +00497 } <span class="keywordflow">else</span> { +00498 m = (<span class="keyword">struct </span><a class="code" href="structmap__node__int64.html">map_node_int64</a> *) +00499 <a class="code" href="alloc_8h.html#a3">_stp_calloc</a>(<span class="keyword">sizeof</span>(<span class="keyword">struct</span> <a class="code" href="structmap__node__int64.html">map_node_int64</a>)); +00500 <span class="comment">/* add node to list */</span> +00501 list_add_tail(&m-><a class="code" href="structmap__node__int64.html#o0">n</a>.<a class="code" href="structmap__node.html#o0">lnode</a>, &map-><a class="code" href="structmap__root.html#o3">head</a>); +00502 } +00503 +00504 <span class="comment">/* copy the key(s) */</span> +00505 map_copy_keys(map, &m-><a class="code" href="structmap__node__int64.html#o0">n</a>); +00506 +00507 <span class="comment">/* set the value */</span> +00508 m-><a class="code" href="structmap__node__int64.html#o1">val</a> = val; +00509 } <span class="keywordflow">else</span> { +00510 <span class="keywordflow">if</span> (map-><a class="code" href="structmap__root.html#o5">key</a> == NULL) +00511 <span class="keywordflow">return</span>; +00512 +00513 <span class="keywordflow">if</span> (val) { +00514 m = (<span class="keyword">struct </span><a class="code" href="structmap__node__int64.html">map_node_int64</a> *)map-><a class="code" href="structmap__root.html#o5">key</a>; +00515 m-><a class="code" href="structmap__node__int64.html#o1">val</a> = val; +00516 } <span class="keywordflow">else</span> { +00517 <span class="comment">/* setting value to 0 is the same as deleting */</span> +00518 <a class="code" href="map_8c.html#a5">_stp_map_key_del</a>(map); +00519 } +00520 } +00521 } +00522 +<a name="l00528"></a><a class="code" href="map_8c.html#a17">00528</a> int64_t <a class="code" href="map_8c.html#a17">_stp_map_get_int64</a>(<a class="code" href="structmap__root.html">MAP</a> map) +00529 { +00530 <span class="keyword">struct </span><a class="code" href="structmap__node__int64.html">map_node_int64</a> *m; +00531 <span class="keywordflow">if</span> (map == NULL || map-><a class="code" href="structmap__root.html#o6">create</a> || map-><a class="code" href="structmap__root.html#o5">key</a> == NULL) +00532 <span class="keywordflow">return</span> 0; +00533 <a class="code" href="runtime_8h.html#a0">dbug</a> (<span class="stringliteral">"%lx\n"</span>, (<span class="keywordtype">long</span>)map-><a class="code" href="structmap__root.html#o5">key</a>); +00534 m = (<span class="keyword">struct </span><a class="code" href="structmap__node__int64.html">map_node_int64</a> *)map-><a class="code" href="structmap__root.html#o5">key</a>; +00535 <span class="keywordflow">return</span> m-><a class="code" href="structmap__node__int64.html#o1">val</a>; +00536 } +00537 +<a name="l00548"></a><a class="code" href="map_8c.html#a18">00548</a> <span class="keywordtype">void</span> <a class="code" href="map_8c.html#a18">_stp_map_set_str</a>(<a class="code" href="structmap__root.html">MAP</a> map, <span class="keywordtype">char</span> *val) +00549 { +00550 <span class="keyword">struct </span>map_node_str *m; +00551 +00552 <span class="keywordflow">if</span> (map == NULL) +00553 <span class="keywordflow">return</span>; +00554 +00555 <span class="keywordflow">if</span> (map-><a class="code" href="structmap__root.html#o6">create</a>) { +00556 <span class="keywordflow">if</span> (val == NULL) +00557 <span class="keywordflow">return</span>; +00558 +00559 <span class="keywordflow">if</span> (map-><a class="code" href="structmap__root.html#o0">maxnum</a>) { +00560 <span class="keywordflow">if</span> (list_empty(&map-><a class="code" href="structmap__root.html#o4">pool</a>)) { +00561 <span class="keywordflow">if</span> (map-><a class="code" href="structmap__root.html#o2">no_wrap</a>) { +00562 <span class="comment">/* ERROR. FIXME */</span> +00563 <span class="keywordflow">return</span>; +00564 } +00565 m = (<span class="keyword">struct </span>map_node_str *)map-><a class="code" href="structmap__root.html#o3">head</a>.next; +00566 hlist_del_init(&m-><a class="code" href="structmap__node__str.html#o0">n</a>.<a class="code" href="structmap__node.html#o1">hnode</a>); +00567 map_free_strings(map, (<span class="keyword">struct</span> <a class="code" href="structmap__node.html">map_node</a> *)m); +00568 <a class="code" href="runtime_8h.html#a0">dbug</a> (<span class="stringliteral">"got %lx off head\n"</span>, (<span class="keywordtype">long</span>)m); +00569 } <span class="keywordflow">else</span> { +00570 m = (<span class="keyword">struct </span>map_node_str *)map-><a class="code" href="structmap__root.html#o4">pool</a>.next; +00571 <a class="code" href="runtime_8h.html#a0">dbug</a> (<span class="stringliteral">"got %lx off pool\n"</span>, (<span class="keywordtype">long</span>)m); +00572 } +00573 list_move_tail(&m-><a class="code" href="structmap__node__str.html#o0">n</a>.<a class="code" href="structmap__node.html#o0">lnode</a>, &map-><a class="code" href="structmap__root.html#o3">head</a>); +00574 } <span class="keywordflow">else</span> { +00575 m = (<span class="keyword">struct </span>map_node_str *) +00576 <a class="code" href="alloc_8h.html#a3">_stp_calloc</a>(<span class="keyword">sizeof</span>(<span class="keyword">struct</span> map_node_str)); +00577 <span class="comment">/* add node to list */</span> +00578 list_add_tail(&m-><a class="code" href="structmap__node__str.html#o0">n</a>.<a class="code" href="structmap__node.html#o0">lnode</a>, &map-><a class="code" href="structmap__root.html#o3">head</a>); +00579 } +00580 +00581 <span class="comment">/* copy the key(s) */</span> +00582 map_copy_keys(map, &m-><a class="code" href="structmap__node__str.html#o0">n</a>); +00583 +00584 <span class="comment">/* set the value */</span> +00585 m-><a class="code" href="structmap__node__str.html#o1">str</a> = <a class="code" href="alloc_8h.html#a2">_stp_alloc</a>(strlen(val) + 1); +00586 strcpy(m-><a class="code" href="structmap__node__str.html#o1">str</a>, val); +00587 } <span class="keywordflow">else</span> { +00588 <span class="keywordflow">if</span> (map-><a class="code" href="structmap__root.html#o5">key</a> == NULL) +00589 <span class="keywordflow">return</span>; +00590 +00591 <span class="keywordflow">if</span> (val) { +00592 m = (<span class="keyword">struct </span>map_node_str *)map-><a class="code" href="structmap__root.html#o5">key</a>; +00593 <span class="keywordflow">if</span> (m-><a class="code" href="structmap__node__str.html#o1">str</a>) +00594 <a class="code" href="alloc_8h.html#a5">_stp_free</a>(m-><a class="code" href="structmap__node__str.html#o1">str</a>); +00595 m-><a class="code" href="structmap__node__str.html#o1">str</a> = <a class="code" href="alloc_8h.html#a2">_stp_alloc</a>(strlen(val) + 1); +00596 strcpy(m-><a class="code" href="structmap__node__str.html#o1">str</a>, val); +00597 } <span class="keywordflow">else</span> { +00598 <span class="comment">/* setting value to 0 is the same as deleting */</span> +00599 <a class="code" href="map_8c.html#a5">_stp_map_key_del</a>(map); +00600 } +00601 } +00602 } +00603 +<a name="l00609"></a><a class="code" href="map_8c.html#a19">00609</a> <span class="keywordtype">char</span> *<a class="code" href="map_8c.html#a19">_stp_map_get_str</a>(<a class="code" href="structmap__root.html">MAP</a> map) +00610 { +00611 <span class="keyword">struct </span>map_node_str *m; +00612 <span class="keywordflow">if</span> (map == NULL || map-><a class="code" href="structmap__root.html#o6">create</a> || map-><a class="code" href="structmap__root.html#o5">key</a> == NULL) +00613 <span class="keywordflow">return</span> NULL; +00614 <a class="code" href="runtime_8h.html#a0">dbug</a> (<span class="stringliteral">"%lx\n"</span>, (<span class="keywordtype">long</span>)map-><a class="code" href="structmap__root.html#o5">key</a>); +00615 m = (<span class="keyword">struct </span>map_node_str *)map-><a class="code" href="structmap__root.html#o5">key</a>; +00616 <span class="keywordflow">return</span> m-><a class="code" href="structmap__node__str.html#o1">str</a>; +00617 } +00618 +<a name="l00633"></a><a class="code" href="map_8c.html#a20">00633</a> <span class="keywordtype">void</span> <a class="code" href="map_8c.html#a20">_stp_map_set_stat</a>(<a class="code" href="structmap__root.html">MAP</a> map, <a class="code" href="structstat.html">stat</a> * stats) +00634 { +00635 <span class="keyword">struct </span>map_node_stat *m; +00636 +00637 <span class="keywordflow">if</span> (map == NULL) +00638 <span class="keywordflow">return</span>; +00639 <a class="code" href="runtime_8h.html#a0">dbug</a> (<span class="stringliteral">"set_stat %lx\n"</span>, (<span class="keywordtype">long</span>)map-><a class="code" href="structmap__root.html#o5">key</a>); +00640 +00641 <span class="keywordflow">if</span> (map-><a class="code" href="structmap__root.html#o6">create</a>) { +00642 <span class="keywordflow">if</span> (stats == NULL) +00643 <span class="keywordflow">return</span>; +00644 +00645 <span class="keywordflow">if</span> (map-><a class="code" href="structmap__root.html#o0">maxnum</a>) { +00646 <span class="keywordflow">if</span> (list_empty(&map-><a class="code" href="structmap__root.html#o4">pool</a>)) { +00647 <span class="keywordflow">if</span> (map-><a class="code" href="structmap__root.html#o2">no_wrap</a>) { +00648 <span class="comment">/* ERROR. FIXME */</span> +00649 <span class="keywordflow">return</span>; +00650 } +00651 m = (<span class="keyword">struct </span>map_node_stat *)map-><a class="code" href="structmap__root.html#o3">head</a>.next; +00652 hlist_del_init(&m-><a class="code" href="structmap__node__stat.html#o0">n</a>.<a class="code" href="structmap__node.html#o1">hnode</a>); +00653 map_free_strings(map, (<span class="keyword">struct</span> <a class="code" href="structmap__node.html">map_node</a> *)m); +00654 <a class="code" href="runtime_8h.html#a0">dbug</a> (<span class="stringliteral">"got %lx off head\n"</span>, (<span class="keywordtype">long</span>)m); +00655 } <span class="keywordflow">else</span> { +00656 m = (<span class="keyword">struct </span>map_node_stat *)map-><a class="code" href="structmap__root.html#o4">pool</a>.next; +00657 <a class="code" href="runtime_8h.html#a0">dbug</a> (<span class="stringliteral">"got %lx off pool\n"</span>, (<span class="keywordtype">long</span>)m); +00658 } +00659 list_move_tail(&m-><a class="code" href="structmap__node__stat.html#o0">n</a>.<a class="code" href="structmap__node.html#o0">lnode</a>, &map-><a class="code" href="structmap__root.html#o3">head</a>); +00660 } <span class="keywordflow">else</span> { +00661 m = (<span class="keyword">struct </span>map_node_stat *) +00662 <a class="code" href="alloc_8h.html#a3">_stp_calloc</a>(<span class="keyword">sizeof</span>(<span class="keyword">struct</span> map_node_stat)); +00663 <span class="comment">/* add node to list */</span> +00664 list_add_tail(&m-><a class="code" href="structmap__node__stat.html#o0">n</a>.<a class="code" href="structmap__node.html#o0">lnode</a>, &map-><a class="code" href="structmap__root.html#o3">head</a>); +00665 } +00666 +00667 <span class="comment">/* copy the key(s) */</span> +00668 map_copy_keys(map, &m-><a class="code" href="structmap__node__stat.html#o0">n</a>); +00669 +00670 <span class="comment">/* set the value */</span> +00671 memcpy(&m-><a class="code" href="structmap__node__stat.html#o1">stats</a>, stats, <span class="keyword">sizeof</span>(<a class="code" href="structstat.html">stat</a>)); +00672 } <span class="keywordflow">else</span> { +00673 <span class="keywordflow">if</span> (map-><a class="code" href="structmap__root.html#o5">key</a> == NULL) +00674 <span class="keywordflow">return</span>; +00675 +00676 <span class="keywordflow">if</span> (stats) { +00677 m = (<span class="keyword">struct </span>map_node_stat *)map-><a class="code" href="structmap__root.html#o5">key</a>; +00678 memcpy(&m-><a class="code" href="structmap__node__stat.html#o1">stats</a>, stats, <span class="keyword">sizeof</span>(<a class="code" href="structstat.html">stat</a>)); +00679 } <span class="keywordflow">else</span> { +00680 <span class="comment">/* setting value to NULL is the same as deleting */</span> +00681 <a class="code" href="map_8c.html#a5">_stp_map_key_del</a>(map); +00682 } +00683 } +00684 } +00685 +<a name="l00692"></a><a class="code" href="map_8c.html#a21">00692</a> <a class="code" href="structstat.html">stat</a> *<a class="code" href="map_8c.html#a21">_stp_map_get_stat</a>(<a class="code" href="structmap__root.html">MAP</a> map) +00693 { +00694 <span class="keyword">struct </span>map_node_stat *m; +00695 <span class="keywordflow">if</span> (map == NULL || map-><a class="code" href="structmap__root.html#o6">create</a> || map-><a class="code" href="structmap__root.html#o5">key</a> == NULL) +00696 <span class="keywordflow">return</span> NULL; +00697 <a class="code" href="runtime_8h.html#a0">dbug</a> (<span class="stringliteral">"%lx\n"</span>, (<span class="keywordtype">long</span>)map-><a class="code" href="structmap__root.html#o5">key</a>); +00698 m = (<span class="keyword">struct </span>map_node_stat *)map-><a class="code" href="structmap__root.html#o5">key</a>; +00699 <span class="keywordflow">return</span> &m-><a class="code" href="structmap__node__stat.html#o1">stats</a>; +00700 } +00701 +<a name="l00713"></a><a class="code" href="map_8c.html#a22">00713</a> <span class="keywordtype">void</span> <a class="code" href="map_8c.html#a22">_stp_map_stat_add</a>(<a class="code" href="structmap__root.html">MAP</a> map, int64_t val) +00714 { +00715 <span class="keyword">struct </span>map_node_stat *m; +00716 <span class="keywordflow">if</span> (map == NULL) +00717 <span class="keywordflow">return</span>; +00718 +00719 <span class="keywordflow">if</span> (map-><a class="code" href="structmap__root.html#o6">create</a>) { +00720 <a class="code" href="structstat.html">stat</a> st = { 1, val, val, val }; +00721 <span class="comment">/* histogram */</span> +00722 <a class="code" href="map_8c.html#a20">_stp_map_set_stat</a>(map, &st); +00723 <span class="keywordflow">return</span>; +00724 } +00725 +00726 <span class="keywordflow">if</span> (map-><a class="code" href="structmap__root.html#o5">key</a> == NULL) +00727 <span class="keywordflow">return</span>; +00728 +00729 <a class="code" href="runtime_8h.html#a0">dbug</a> (<span class="stringliteral">"add_stat %lx\n"</span>, (<span class="keywordtype">long</span>)map-><a class="code" href="structmap__root.html#o5">key</a>); +00730 m = (<span class="keyword">struct </span>map_node_stat *)map-><a class="code" href="structmap__root.html#o5">key</a>; +00731 m-><a class="code" href="structmap__node__stat.html#o1">stats</a>.<a class="code" href="structstat.html#o0">count</a>++; +00732 m-><a class="code" href="structmap__node__stat.html#o1">stats</a>.<a class="code" href="structstat.html#o1">sum</a> += val; +00733 <span class="keywordflow">if</span> (val > m-><a class="code" href="structmap__node__stat.html#o1">stats</a>.<a class="code" href="structstat.html#o3">max</a>) +00734 m-><a class="code" href="structmap__node__stat.html#o1">stats</a>.<a class="code" href="structstat.html#o3">max</a> = val; +00735 <span class="keywordflow">if</span> (val < m-><a class="code" href="structmap__node__stat.html#o1">stats</a>.<a class="code" href="structstat.html#o2">min</a>) +00736 m-><a class="code" href="structmap__node__stat.html#o1">stats</a>.<a class="code" href="structstat.html#o2">min</a> = val; +00737 <span class="comment">/* histogram */</span> +00738 } +00739 +00740 <span class="comment">/********************** List Functions *********************/</span> +00741 +<a name="l00753"></a><a class="code" href="map_8c.html#a23">00753</a> <a class="code" href="structmap__root.html">MAP</a> <a class="code" href="map_8c.html#a23">_stp_list_new</a>(<span class="keywordtype">unsigned</span> max_entries, <span class="keyword">enum</span> valtype type) +00754 { +00755 <a class="code" href="structmap__root.html">MAP</a> map = <a class="code" href="map_8c.html#a3">_stp_map_new</a> (max_entries, type); +00756 map-><a class="code" href="structmap__root.html#o2">no_wrap</a> = 1; +00757 <span class="keywordflow">return</span> map; +00758 } +00759 +<a name="l00765"></a><a class="code" href="map_8c.html#a24">00765</a> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="map_8c.html#a24">_stp_list_clear</a>(<a class="code" href="structmap__root.html">MAP</a> map) +00766 { +00767 <span class="keywordflow">if</span> (map == NULL) +00768 <span class="keywordflow">return</span>; +00769 +00770 <span class="keywordflow">if</span> (!list_empty(&map-><a class="code" href="structmap__root.html#o3">head</a>)) { +00771 <span class="keyword">struct </span><a class="code" href="structmap__node.html">map_node</a> *ptr = (<span class="keyword">struct </span><a class="code" href="structmap__node.html">map_node</a> *)map-><a class="code" href="structmap__root.html#o3">head</a>.next; +00772 +00773 <span class="keywordflow">while</span> (ptr && ptr != (<span class="keyword">struct </span><a class="code" href="structmap__node.html">map_node</a> *)&map-><a class="code" href="structmap__root.html#o3">head</a>) { +00774 <span class="keyword">struct </span><a class="code" href="structmap__node.html">map_node</a> *next = (<span class="keyword">struct </span><a class="code" href="structmap__node.html">map_node</a> *)ptr-><a class="code" href="structmap__node.html#o0">lnode</a>.next; +00775 +00776 <span class="comment">/* remove node from old hash list */</span> +00777 hlist_del_init(&ptr-><a class="code" href="structmap__node.html#o1">hnode</a>); +00778 +00779 <span class="comment">/* remove from entry list */</span> +00780 list_del(&ptr-><a class="code" href="structmap__node.html#o0">lnode</a>); +00781 +00782 <span class="comment">/* remove any allocated string storage */</span> +00783 map_free_strings(map, ptr); +00784 +00785 <span class="keywordflow">if</span> (map-><a class="code" href="structmap__root.html#o0">maxnum</a>) +00786 list_add(&ptr-><a class="code" href="structmap__node.html#o0">lnode</a>, &map-><a class="code" href="structmap__root.html#o4">pool</a>); +00787 <span class="keywordflow">else</span> +00788 <a class="code" href="alloc_8h.html#a5">_stp_free</a>(ptr); +00789 +00790 map-><a class="code" href="structmap__root.html#o1">num</a>--; +00791 ptr = next; +00792 } +00793 } +00794 +00795 <span class="keywordflow">if</span> (map-><a class="code" href="structmap__root.html#o1">num</a> != 0) { +00796 <a class="code" href="io_8c.html#a0">dlog</a> (<span class="stringliteral">"ERROR: list is supposed to be empty (has %d)\n"</span>, map-><a class="code" href="structmap__root.html#o1">num</a>); +00797 } +00798 } +00799 +<a name="l00805"></a><a class="code" href="map_8c.html#a25">00805</a> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="map_8c.html#a25">_stp_list_add_str</a>(<a class="code" href="structmap__root.html">MAP</a> map, <span class="keywordtype">char</span> *str) +00806 { +00807 <a class="code" href="map_8c.html#a14">_stp_map_key_long</a>(map, map-><a class="code" href="structmap__root.html#o1">num</a>); +00808 <a class="code" href="map_8c.html#a18">_stp_map_set_str</a>(map, str); +00809 } +00810 +<a name="l00816"></a><a class="code" href="map_8c.html#a26">00816</a> <span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="map_8c.html#a26">_stp_list_add_int64</a>(<a class="code" href="structmap__root.html">MAP</a> map, int64_t val) +00817 { +00818 <a class="code" href="map_8c.html#a14">_stp_map_key_long</a>(map, map-><a class="code" href="structmap__root.html#o1">num</a>); +00819 <a class="code" href="map_8c.html#a16">_stp_map_set_int64</a>(map, val); +00820 } +00821 +<a name="l00827"></a><a class="code" href="map_8c.html#a27">00827</a> <span class="keyword">inline</span> <span class="keywordtype">int</span> <a class="code" href="map_8c.html#a27">_stp_list_size</a>(<a class="code" href="structmap__root.html">MAP</a> map) +00828 { +00829 <span class="keywordflow">return</span> map-><a class="code" href="structmap__root.html#o1">num</a>; +00830 } +</pre></div><hr size="1"><address style="align: right;"><small>Generated on Wed Mar 9 13:21:28 2005 for SystemTap by +<a href="http://www.doxygen.org/index.html"> +<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.3.9.1 </small></address> +</body> +</html> |