summaryrefslogtreecommitdiffstats
path: root/runtime/docs/html/map_8c-source.html
diff options
context:
space:
mode:
Diffstat (limited to 'runtime/docs/html/map_8c-source.html')
-rw-r--r--runtime/docs/html/map_8c-source.html661
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 &amp;&amp; count++ &lt; 5) {
+00016 hash += *v1++;
+00017 }
+00018 <span class="keywordflow">while</span> (v2 &amp;&amp; *v2 &amp;&amp; count++ &lt; 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 &amp;&amp; *v &amp;&amp; count++ &lt; 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(&amp;m-&gt;<a class="code" href="structmap__root.html#o3">head</a>);
+00051
+00052 m-&gt;<a class="code" href="structmap__root.html#o0">maxnum</a> = max_entries;
+00053 m-&gt;type = type;
+00054 <span class="keywordflow">if</span> (type &gt;= 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(&amp;m-&gt;<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 &gt;= 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, &amp;m-&gt;<a class="code" href="structmap__root.html#o4">pool</a>);
+00072 }
+00073 m-&gt;<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-&gt;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-&gt;<a class="code" href="structmap__node__str.html#o1">str</a>);
+00084 <span class="keywordflow">if</span> (m-&gt;<a class="code" href="structmap__node__str.html#o1">str</a>)
+00085 <a class="code" href="alloc_8h.html#a5">_stp_free</a>(m-&gt;<a class="code" href="structmap__node__str.html#o1">str</a>);
+00086 }
+00087 <span class="keywordflow">if</span> (m-&gt;<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-&gt;<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-&gt;<a class="code" href="structmap__root.html#o6">create</a>, (<span class="keywordtype">long</span>)map-&gt;<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-&gt;<a class="code" href="structmap__root.html#o6">create</a>) {
+00113 map-&gt;<a class="code" href="structmap__root.html#o6">create</a> = 0;
+00114 map-&gt;<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-&gt;<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-&gt;<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(&amp;m-&gt;<a class="code" href="structmap__node.html#o1">hnode</a>);
+00125
+00126 <span class="comment">/* remove from entry list */</span>
+00127 list_del(&amp;m-&gt;<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-&gt;<a class="code" href="structmap__root.html#o5">key</a>);
+00131
+00132 <span class="keywordflow">if</span> (map-&gt;<a class="code" href="structmap__root.html#o0">maxnum</a>)
+00133 list_add(&amp;m-&gt;<a class="code" href="structmap__node.html#o0">lnode</a>, &amp;map-&gt;<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-&gt;<a class="code" href="structmap__root.html#o5">key</a> = NULL;
+00138 map-&gt;<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-&gt;<a class="code" href="structmap__root.html#o3">head</a>.next);
+00155
+00156 <span class="keywordflow">if</span> (list_empty(&amp;map-&gt;<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-&gt;<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-&gt;head.next=%lx\n"</span>, (<span class="keywordtype">long</span>)m, (<span class="keywordtype">long</span>)m-&gt;<a class="code" href="structmap__node.html#o0">lnode</a>.next, (<span class="keywordtype">long</span>)m-&gt;<a class="code" href="structmap__node.html#o0">lnode</a>.prev, (<span class="keywordtype">long</span>)map-&gt;<a class="code" href="structmap__root.html#o3">head</a>.next);
+00178
+00179 <span class="keywordflow">if</span> (m-&gt;lnode.next == &amp;map-&gt;<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-&gt;<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(&amp;map-&gt;<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-&gt;<a class="code" href="structmap__root.html#o3">head</a>.next;
+00197 <span class="keywordflow">while</span> (ptr &amp;&amp; ptr != (<span class="keyword">struct </span><a class="code" href="structmap__node.html">map_node</a> *)&amp;map-&gt;<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-&gt;<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-&gt;<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 = &amp;map-&gt;<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-&gt;<a class="code" href="structmap__node.html#o2">key1</a>.<a class="code" href="unionkey__data.html#o0">val</a>, n-&gt;key2.<a class="code" href="unionkey__data.html#o0">val</a>);
+00236 <span class="keywordflow">if</span> (key1 == n-&gt;key1.val &amp;&amp; key2 == n-&gt;key2.val) {
+00237 map-&gt;<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-&gt;<a class="code" href="structmap__root.html#o5">key</a>);
+00239 map-&gt;<a class="code" href="structmap__root.html#o6">create</a> = 0;
+00240 <span class="keywordflow">return</span>;
+00241 }
+00242 }
+00243
+00244 map-&gt;<a class="code" href="structmap__root.html#o8">c_key1</a>.<a class="code" href="unionkey__data.html#o0">val</a> = key1;
+00245 map-&gt;<a class="code" href="structmap__root.html#o9">c_key2</a>.<a class="code" href="unionkey__data.html#o0">val</a> = key2;
+00246 map-&gt;c_key1type = LONG;
+00247 map-&gt;c_key2type = LONG;
+00248 map-&gt;<a class="code" href="structmap__root.html#o7">c_keyhead</a> = head;
+00249 map-&gt;<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-&gt;<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 = &amp;map-&gt;<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-&gt;<a class="code" href="structmap__node.html#o2">key1</a>.<a class="code" href="unionkey__data.html#o1">str</a>,n-&gt;<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-&gt;<a class="code" href="structmap__node.html#o2">key1</a>.<a class="code" href="unionkey__data.html#o1">str</a>) == 0
+00285 &amp;&amp; (key2 == NULL || strcmp(key2, n-&gt;<a class="code" href="structmap__node.html#o3">key2</a>.<a class="code" href="unionkey__data.html#o1">str</a>) == 0)) {
+00286 map-&gt;<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-&gt;<a class="code" href="structmap__root.html#o5">key</a>);
+00288 map-&gt;<a class="code" href="structmap__root.html#o6">create</a> = 0;
+00289 <span class="keywordflow">return</span>;
+00290 }
+00291 }
+00292
+00293 map-&gt;<a class="code" href="structmap__root.html#o8">c_key1</a>.<a class="code" href="unionkey__data.html#o1">str</a> = key1;
+00294 map-&gt;<a class="code" href="structmap__root.html#o9">c_key2</a>.<a class="code" href="unionkey__data.html#o1">str</a> = key2;
+00295 map-&gt;c_key1type = STR;
+00296 map-&gt;c_key2type = STR;
+00297 map-&gt;<a class="code" href="structmap__root.html#o7">c_keyhead</a> = head;
+00298 map-&gt;<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-&gt;<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 = &amp;map-&gt;<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-&gt;<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-&gt;<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-&gt;<a class="code" href="structmap__node.html#o2">key1</a>.<a class="code" href="unionkey__data.html#o1">str</a>) == 0 &amp;&amp; key2 == n-&gt;<a class="code" href="structmap__node.html#o3">key2</a>.<a class="code" href="unionkey__data.html#o0">val</a>) {
+00334 map-&gt;<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-&gt;<a class="code" href="structmap__root.html#o5">key</a>);
+00336 map-&gt;<a class="code" href="structmap__root.html#o6">create</a> = 0;
+00337 <span class="keywordflow">return</span>;
+00338 }
+00339 }
+00340
+00341 map-&gt;<a class="code" href="structmap__root.html#o8">c_key1</a>.<a class="code" href="unionkey__data.html#o1">str</a> = key1;
+00342 map-&gt;<a class="code" href="structmap__root.html#o9">c_key2</a>.<a class="code" href="unionkey__data.html#o0">val</a> = key2;
+00343 map-&gt;c_key1type = STR;
+00344 map-&gt;c_key2type = LONG;
+00345 map-&gt;<a class="code" href="structmap__root.html#o7">c_keyhead</a> = head;
+00346 map-&gt;<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 = &amp;map-&gt;<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-&gt;<a class="code" href="structmap__node.html#o2">key1</a>.<a class="code" href="unionkey__data.html#o0">val</a>,n-&gt;<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-&gt;<a class="code" href="structmap__node.html#o2">key1</a>.<a class="code" href="unionkey__data.html#o0">val</a> &amp;&amp; strcmp(key2, n-&gt;<a class="code" href="structmap__node.html#o3">key2</a>.<a class="code" href="unionkey__data.html#o1">str</a>) == 0) {
+00376 map-&gt;<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-&gt;<a class="code" href="structmap__root.html#o5">key</a>);
+00378 map-&gt;<a class="code" href="structmap__root.html#o6">create</a> = 0;
+00379 <span class="keywordflow">return</span>;
+00380 }
+00381 }
+00382
+00383 map-&gt;<a class="code" href="structmap__root.html#o8">c_key1</a>.<a class="code" href="unionkey__data.html#o0">val</a> = key1;
+00384 map-&gt;<a class="code" href="structmap__root.html#o9">c_key2</a>.<a class="code" href="unionkey__data.html#o1">str</a> = key2;
+00385 map-&gt;c_key1type = LONG;
+00386 map-&gt;c_key2type = STR;
+00387 map-&gt;<a class="code" href="structmap__root.html#o7">c_keyhead</a> = head;
+00388 map-&gt;<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-&gt;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-&gt;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-&gt;key1type = map-&gt;c_key1type;
+00428 m-&gt;key2type = map-&gt;c_key2type;
+00429 <span class="keywordflow">switch</span> (map-&gt;c_key1type) {
+00430 <span class="keywordflow">case</span> <a class="code" href="map_8h.html#a18a13">STR</a>:
+00431 m-&gt;<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-&gt;<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-&gt;<a class="code" href="structmap__node.html#o2">key1</a>.<a class="code" href="unionkey__data.html#o1">str</a>, map-&gt;<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-&gt;<a class="code" href="structmap__node.html#o2">key1</a>.<a class="code" href="unionkey__data.html#o0">val</a> = map-&gt;<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-&gt;c_key2type) {
+00442 <span class="keywordflow">case</span> <a class="code" href="map_8h.html#a18a13">STR</a>:
+00443 m-&gt;<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-&gt;<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-&gt;<a class="code" href="structmap__node.html#o3">key2</a>.<a class="code" href="unionkey__data.html#o1">str</a>, map-&gt;<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-&gt;<a class="code" href="structmap__node.html#o3">key2</a>.<a class="code" href="unionkey__data.html#o0">val</a> = map-&gt;<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(&amp;m-&gt;<a class="code" href="structmap__node.html#o1">hnode</a>, map-&gt;<a class="code" href="structmap__root.html#o7">c_keyhead</a>);
+00455
+00456 map-&gt;<a class="code" href="structmap__root.html#o5">key</a> = m;
+00457 map-&gt;<a class="code" href="structmap__root.html#o6">create</a> = 0;
+00458 map-&gt;<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-&gt;<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-&gt;<a class="code" href="structmap__root.html#o0">maxnum</a>) {
+00483 <span class="keywordflow">if</span> (list_empty(&amp;map-&gt;<a class="code" href="structmap__root.html#o4">pool</a>)) {
+00484 <span class="keywordflow">if</span> (map-&gt;<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-&gt;<a class="code" href="structmap__root.html#o3">head</a>.next;
+00489 hlist_del_init(&amp;m-&gt;<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-&gt;<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(&amp;m-&gt;<a class="code" href="structmap__node__int64.html#o0">n</a>.<a class="code" href="structmap__node.html#o0">lnode</a>, &amp;map-&gt;<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(&amp;m-&gt;<a class="code" href="structmap__node__int64.html#o0">n</a>.<a class="code" href="structmap__node.html#o0">lnode</a>, &amp;map-&gt;<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, &amp;m-&gt;<a class="code" href="structmap__node__int64.html#o0">n</a>);
+00506
+00507 <span class="comment">/* set the value */</span>
+00508 m-&gt;<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-&gt;<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-&gt;<a class="code" href="structmap__root.html#o5">key</a>;
+00515 m-&gt;<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-&gt;<a class="code" href="structmap__root.html#o6">create</a> || map-&gt;<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-&gt;<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-&gt;<a class="code" href="structmap__root.html#o5">key</a>;
+00535 <span class="keywordflow">return</span> m-&gt;<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-&gt;<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-&gt;<a class="code" href="structmap__root.html#o0">maxnum</a>) {
+00560 <span class="keywordflow">if</span> (list_empty(&amp;map-&gt;<a class="code" href="structmap__root.html#o4">pool</a>)) {
+00561 <span class="keywordflow">if</span> (map-&gt;<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-&gt;<a class="code" href="structmap__root.html#o3">head</a>.next;
+00566 hlist_del_init(&amp;m-&gt;<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-&gt;<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(&amp;m-&gt;<a class="code" href="structmap__node__str.html#o0">n</a>.<a class="code" href="structmap__node.html#o0">lnode</a>, &amp;map-&gt;<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(&amp;m-&gt;<a class="code" href="structmap__node__str.html#o0">n</a>.<a class="code" href="structmap__node.html#o0">lnode</a>, &amp;map-&gt;<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, &amp;m-&gt;<a class="code" href="structmap__node__str.html#o0">n</a>);
+00583
+00584 <span class="comment">/* set the value */</span>
+00585 m-&gt;<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-&gt;<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-&gt;<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-&gt;<a class="code" href="structmap__root.html#o5">key</a>;
+00593 <span class="keywordflow">if</span> (m-&gt;<a class="code" href="structmap__node__str.html#o1">str</a>)
+00594 <a class="code" href="alloc_8h.html#a5">_stp_free</a>(m-&gt;<a class="code" href="structmap__node__str.html#o1">str</a>);
+00595 m-&gt;<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-&gt;<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-&gt;<a class="code" href="structmap__root.html#o6">create</a> || map-&gt;<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-&gt;<a class="code" href="structmap__root.html#o5">key</a>);
+00615 m = (<span class="keyword">struct </span>map_node_str *)map-&gt;<a class="code" href="structmap__root.html#o5">key</a>;
+00616 <span class="keywordflow">return</span> m-&gt;<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-&gt;<a class="code" href="structmap__root.html#o5">key</a>);
+00640
+00641 <span class="keywordflow">if</span> (map-&gt;<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-&gt;<a class="code" href="structmap__root.html#o0">maxnum</a>) {
+00646 <span class="keywordflow">if</span> (list_empty(&amp;map-&gt;<a class="code" href="structmap__root.html#o4">pool</a>)) {
+00647 <span class="keywordflow">if</span> (map-&gt;<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-&gt;<a class="code" href="structmap__root.html#o3">head</a>.next;
+00652 hlist_del_init(&amp;m-&gt;<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-&gt;<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(&amp;m-&gt;<a class="code" href="structmap__node__stat.html#o0">n</a>.<a class="code" href="structmap__node.html#o0">lnode</a>, &amp;map-&gt;<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(&amp;m-&gt;<a class="code" href="structmap__node__stat.html#o0">n</a>.<a class="code" href="structmap__node.html#o0">lnode</a>, &amp;map-&gt;<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, &amp;m-&gt;<a class="code" href="structmap__node__stat.html#o0">n</a>);
+00669
+00670 <span class="comment">/* set the value */</span>
+00671 memcpy(&amp;m-&gt;<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-&gt;<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-&gt;<a class="code" href="structmap__root.html#o5">key</a>;
+00678 memcpy(&amp;m-&gt;<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-&gt;<a class="code" href="structmap__root.html#o6">create</a> || map-&gt;<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-&gt;<a class="code" href="structmap__root.html#o5">key</a>);
+00698 m = (<span class="keyword">struct </span>map_node_stat *)map-&gt;<a class="code" href="structmap__root.html#o5">key</a>;
+00699 <span class="keywordflow">return</span> &amp;m-&gt;<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-&gt;<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, &amp;st);
+00723 <span class="keywordflow">return</span>;
+00724 }
+00725
+00726 <span class="keywordflow">if</span> (map-&gt;<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-&gt;<a class="code" href="structmap__root.html#o5">key</a>);
+00730 m = (<span class="keyword">struct </span>map_node_stat *)map-&gt;<a class="code" href="structmap__root.html#o5">key</a>;
+00731 m-&gt;<a class="code" href="structmap__node__stat.html#o1">stats</a>.<a class="code" href="structstat.html#o0">count</a>++;
+00732 m-&gt;<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 &gt; m-&gt;<a class="code" href="structmap__node__stat.html#o1">stats</a>.<a class="code" href="structstat.html#o3">max</a>)
+00734 m-&gt;<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 &lt; m-&gt;<a class="code" href="structmap__node__stat.html#o1">stats</a>.<a class="code" href="structstat.html#o2">min</a>)
+00736 m-&gt;<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-&gt;<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(&amp;map-&gt;<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-&gt;<a class="code" href="structmap__root.html#o3">head</a>.next;
+00772
+00773 <span class="keywordflow">while</span> (ptr &amp;&amp; ptr != (<span class="keyword">struct </span><a class="code" href="structmap__node.html">map_node</a> *)&amp;map-&gt;<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-&gt;<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(&amp;ptr-&gt;<a class="code" href="structmap__node.html#o1">hnode</a>);
+00778
+00779 <span class="comment">/* remove from entry list */</span>
+00780 list_del(&amp;ptr-&gt;<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-&gt;<a class="code" href="structmap__root.html#o0">maxnum</a>)
+00786 list_add(&amp;ptr-&gt;<a class="code" href="structmap__node.html#o0">lnode</a>, &amp;map-&gt;<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-&gt;<a class="code" href="structmap__root.html#o1">num</a>--;
+00791 ptr = next;
+00792 }
+00793 }
+00794
+00795 <span class="keywordflow">if</span> (map-&gt;<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-&gt;<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-&gt;<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-&gt;<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-&gt;<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&nbsp;
+<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>