summaryrefslogtreecommitdiffstats
path: root/runtime/docs
diff options
context:
space:
mode:
authorhunt <hunt>2005-04-07 15:17:29 +0000
committerhunt <hunt>2005-04-07 15:17:29 +0000
commit3d4bc8bea6b45893bd4b49f44df26bd602b4cba5 (patch)
treebae3fb1bc5fcbd7906574b6902c649b203274a3f /runtime/docs
parent6e01db401be4a19e6d81d9955d055e2f4e1b6aea (diff)
downloadsystemtap-steved-3d4bc8bea6b45893bd4b49f44df26bd602b4cba5.tar.gz
systemtap-steved-3d4bc8bea6b45893bd4b49f44df26bd602b4cba5.tar.xz
systemtap-steved-3d4bc8bea6b45893bd4b49f44df26bd602b4cba5.zip
Update to use relayfs.
Diffstat (limited to 'runtime/docs')
-rw-r--r--runtime/docs/html/dir_000003.html2
-rw-r--r--runtime/docs/html/dir_000004.html2
-rw-r--r--runtime/docs/html/dtr_8mod_8c-source.html63
-rw-r--r--runtime/docs/html/files.html2
-rw-r--r--runtime/docs/html/globals.html3
-rw-r--r--runtime/docs/html/globals_func.html3
-rw-r--r--runtime/docs/html/group__scbuf.html70
-rw-r--r--runtime/docs/html/group__stack.html51
-rw-r--r--runtime/docs/html/group__sym.html2
-rw-r--r--runtime/docs/html/kprobe__where__funct_8c-source.html4
-rw-r--r--runtime/docs/html/scbuf_8c-source.html164
-rw-r--r--runtime/docs/html/stack_8c-source.html43
-rw-r--r--runtime/docs/html/stack_8c.html4
-rw-r--r--runtime/docs/html/structmap__root.html2
-rw-r--r--runtime/docs/html/test4_2dtr_8c-source.html371
-rw-r--r--runtime/docs/html/todo.html7
16 files changed, 521 insertions, 272 deletions
diff --git a/runtime/docs/html/dir_000003.html b/runtime/docs/html/dir_000003.html
index 173623b3..b9e20e19 100644
--- a/runtime/docs/html/dir_000003.html
+++ b/runtime/docs/html/dir_000003.html
@@ -13,6 +13,8 @@
<tr><td colspan="2"><br><h2>Files</h2></td></tr>
<tr><td class="memItemLeft" nowrap align="right" valign="top">file &nbsp;</td><td class="memItemRight" valign="bottom"><b>dtr.c</b> <a href="test4_2dtr_8c-source.html">[code]</a></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">file &nbsp;</td><td class="memItemRight" valign="bottom"><b>dtr.mod.c</b> <a href="dtr_8mod_8c-source.html">[code]</a></td></tr>
+
<tr><td class="memItemLeft" nowrap align="right" valign="top">file &nbsp;</td><td class="memItemRight" valign="bottom"><b>nrec.c</b> <a href="nrec_8c-source.html">[code]</a></td></tr>
<tr><td class="memItemLeft" nowrap align="right" valign="top">file &nbsp;</td><td class="memItemRight" valign="bottom"><b>README</b> <a href="probes_2test4_2README-source.html">[code]</a></td></tr>
diff --git a/runtime/docs/html/dir_000004.html b/runtime/docs/html/dir_000004.html
index f2294de2..d3e72861 100644
--- a/runtime/docs/html/dir_000004.html
+++ b/runtime/docs/html/dir_000004.html
@@ -13,6 +13,8 @@
<tr><td colspan="2"><br><h2>Files</h2></td></tr>
<tr><td class="memItemLeft" nowrap align="right" valign="top">file &nbsp;</td><td class="memItemRight" valign="bottom"><b>kprobe_where_funct.c</b> <a href="kprobe__where__funct_8c-source.html">[code]</a></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">file &nbsp;</td><td class="memItemRight" valign="bottom"><b>kprobe_where_funct.mod.c</b> <a href="kprobe__where__funct_8mod_8c-source.html">[code]</a></td></tr>
+
<tr><td class="memItemLeft" nowrap align="right" valign="top">file &nbsp;</td><td class="memItemRight" valign="bottom"><b>README</b> <a href="probes_2where__func_2README-source.html">[code]</a></td></tr>
</table>
diff --git a/runtime/docs/html/dtr_8mod_8c-source.html b/runtime/docs/html/dtr_8mod_8c-source.html
index 1deec9c6..e497c5c4 100644
--- a/runtime/docs/html/dtr_8mod_8c-source.html
+++ b/runtime/docs/html/dtr_8mod_8c-source.html
@@ -3,7 +3,7 @@
<title>SystemTap: probes/test4/dtr.mod.c Source File</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
</head><body>
-<!-- Generated by Doxygen 1.3.9.1 -->
+<!-- Generated by Doxygen 1.4.1 -->
<div class="qindex"><a class="qindex" href="index.html">Main&nbsp;Page</a> | <a class="qindex" href="modules.html">Modules</a> | <a class="qindex" href="annotated.html">Data&nbsp;Structures</a> | <a class="qindex" href="dirs.html">Directories</a> | <a class="qindex" href="files.html">File&nbsp;List</a> | <a class="qindex" href="functions.html">Data&nbsp;Fields</a> | <a class="qindex" href="globals.html">Globals</a> | <a class="qindex" href="pages.html">Related&nbsp;Pages</a></div>
<div class="nav">
<a class="el" href="dir_000000.html">probes</a>&nbsp;/&nbsp;<a class="el" href="dir_000003.html">test4</a></div>
@@ -27,30 +27,39 @@
00018 __attribute_used__
00019 __attribute__((section("__versions"))) = {
00020 { 0x506abef7, <span class="stringliteral">"struct_module"</span> },
-00021 { 0xb240ca65, <span class="stringliteral">"schedule_work"</span> },
-00022 { 0x1b9aca3f, <span class="stringliteral">"jprobe_return"</span> },
-00023 { 0xe3b0192b, <span class="stringliteral">"vscnprintf"</span> },
-00024 { 0x45e5f47f, <span class="stringliteral">"register_kprobe"</span> },
-00025 { 0x1e736243, <span class="stringliteral">"unregister_kprobe"</span> },
-00026 { 0xdd03a51e, <span class="stringliteral">"register_jprobe"</span> },
-00027 { 0x49a83d3a, <span class="stringliteral">"unregister_jprobe"</span> },
-00028 { 0x3fa03a97, <span class="stringliteral">"memset"</span> },
-00029 { 0xc16fe12d, <span class="stringliteral">"__memcpy"</span> },
-00030 { 0xe914e41e, <span class="stringliteral">"strcpy"</span> },
-00031 { 0xe2d5255a, <span class="stringliteral">"strcmp"</span> },
-00032 { 0x2fd1d81c, <span class="stringliteral">"vfree"</span> },
-00033 { 0x37a0cba, <span class="stringliteral">"kfree"</span> },
-00034 { 0xd6ee688f, <span class="stringliteral">"vmalloc"</span> },
-00035 { 0x8ce16b3f, <span class="stringliteral">"__kmalloc"</span> },
-00036 { 0x8e3c9cc3, <span class="stringliteral">"vprintk"</span> },
-00037 { 0xdd132261, <span class="stringliteral">"printk"</span> },
-00038 };
-00039
-00040 <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">char</span> __module_depends[]
-00041 __attribute_used__
-00042 __attribute__((section(<span class="stringliteral">".modinfo"</span>))) =
-00043 <span class="stringliteral">"depends="</span>;
-00044
-00045
-00046 MODULE_INFO(srcversion, <span class="stringliteral">"3CC4F9300C5C4E353BD2804"</span>);
+00021 { 0xfcdec747, <span class="stringliteral">"sock_release"</span> },
+00022 { 0x8968634b, <span class="stringliteral">"netlink_kernel_create"</span> },
+00023 { 0xb240ca65, <span class="stringliteral">"schedule_work"</span> },
+00024 { 0x1b9aca3f, <span class="stringliteral">"jprobe_return"</span> },
+00025 { 0x757b6858, <span class="stringliteral">"skb_dequeue"</span> },
+00026 { 0xd4aed67a, <span class="stringliteral">"netlink_ack"</span> },
+00027 { 0x5fc0695e, <span class="stringliteral">"__kfree_skb"</span> },
+00028 { 0xaa1449d7, <span class="stringliteral">"netlink_unicast"</span> },
+00029 { 0x3958414f, <span class="stringliteral">"skb_over_panic"</span> },
+00030 { 0x559dbbb8, <span class="stringliteral">"alloc_skb"</span> },
+00031 { 0x7ec9bfbc, <span class="stringliteral">"strncpy"</span> },
+00032 { 0xe3b0192b, <span class="stringliteral">"vscnprintf"</span> },
+00033 { 0x45e5f47f, <span class="stringliteral">"register_kprobe"</span> },
+00034 { 0x1e736243, <span class="stringliteral">"unregister_kprobe"</span> },
+00035 { 0xdd03a51e, <span class="stringliteral">"register_jprobe"</span> },
+00036 { 0x49a83d3a, <span class="stringliteral">"unregister_jprobe"</span> },
+00037 { 0x3fa03a97, <span class="stringliteral">"memset"</span> },
+00038 { 0xc16fe12d, <span class="stringliteral">"__memcpy"</span> },
+00039 { 0xe914e41e, <span class="stringliteral">"strcpy"</span> },
+00040 { 0xe2d5255a, <span class="stringliteral">"strcmp"</span> },
+00041 { 0x2fd1d81c, <span class="stringliteral">"vfree"</span> },
+00042 { 0x37a0cba, <span class="stringliteral">"kfree"</span> },
+00043 { 0xd6ee688f, <span class="stringliteral">"vmalloc"</span> },
+00044 { 0x8ce16b3f, <span class="stringliteral">"__kmalloc"</span> },
+00045 { 0x8e3c9cc3, <span class="stringliteral">"vprintk"</span> },
+00046 { 0xdd132261, <span class="stringliteral">"printk"</span> },
+00047 };
+00048
+00049 <span class="keyword">static</span> <span class="keyword">const</span> <span class="keywordtype">char</span> __module_depends[]
+00050 __attribute_used__
+00051 __attribute__((section(<span class="stringliteral">".modinfo"</span>))) =
+00052 <span class="stringliteral">"depends="</span>;
+00053
+00054
+00055 MODULE_INFO(srcversion, <span class="stringliteral">"01D3B50188E5E952DA9FD12"</span>);
</pre></div></body></html>
diff --git a/runtime/docs/html/files.html b/runtime/docs/html/files.html
index ef853864..f61591f6 100644
--- a/runtime/docs/html/files.html
+++ b/runtime/docs/html/files.html
@@ -24,9 +24,11 @@
<tr><td class="indexkey">probes/tasklet/<b>README</b> <a href="probes_2tasklet_2README-source.html">[code]</a></td><td class="indexvalue"></td></tr>
<tr><td class="indexkey">probes/tasklet/<b>stp_tasklet.c</b> <a href="stp__tasklet_8c-source.html">[code]</a></td><td class="indexvalue"></td></tr>
<tr><td class="indexkey">probes/test4/<b>dtr.c</b> <a href="test4_2dtr_8c-source.html">[code]</a></td><td class="indexvalue"></td></tr>
+ <tr><td class="indexkey">probes/test4/<b>dtr.mod.c</b> <a href="dtr_8mod_8c-source.html">[code]</a></td><td class="indexvalue"></td></tr>
<tr><td class="indexkey">probes/test4/<b>nrec.c</b> <a href="nrec_8c-source.html">[code]</a></td><td class="indexvalue"></td></tr>
<tr><td class="indexkey">probes/test4/<b>README</b> <a href="probes_2test4_2README-source.html">[code]</a></td><td class="indexvalue"></td></tr>
<tr><td class="indexkey">probes/where_func/<b>kprobe_where_funct.c</b> <a href="kprobe__where__funct_8c-source.html">[code]</a></td><td class="indexvalue"></td></tr>
+ <tr><td class="indexkey">probes/where_func/<b>kprobe_where_funct.mod.c</b> <a href="kprobe__where__funct_8mod_8c-source.html">[code]</a></td><td class="indexvalue"></td></tr>
<tr><td class="indexkey">probes/where_func/<b>README</b> <a href="probes_2where__func_2README-source.html">[code]</a></td><td class="indexvalue"></td></tr>
</table>
</body></html>
diff --git a/runtime/docs/html/globals.html b/runtime/docs/html/globals.html
index 74f0f2e2..7ac847b4 100644
--- a/runtime/docs/html/globals.html
+++ b/runtime/docs/html/globals.html
@@ -50,7 +50,8 @@ Here is a list of all documented functions, variables, defines, enums, and typed
: <a class="el" href="group__io.html#ga2">io.c</a><li>_stp_register_jprobes()
: <a class="el" href="probes_8c.html#a2">probes.c</a><li>_stp_register_kprobes()
: <a class="el" href="probes_8c.html#a4">probes.c</a><li>_stp_ret_addr()
-: <a class="el" href="group__current.html#ga0">current.c</a><li>_stp_strncpy_from_user()
+: <a class="el" href="group__current.html#ga0">current.c</a><li>_stp_stack_print()
+: <a class="el" href="group__stack.html#ga6">stack.c</a><li>_stp_strncpy_from_user()
: <a class="el" href="group__copy.html#ga0">copy.c</a><li>_stp_unregister_jprobes()
: <a class="el" href="probes_8c.html#a1">probes.c</a><li>_stp_unregister_kprobes()
: <a class="el" href="probes_8c.html#a3">probes.c</a><li>_stp_valloc()
diff --git a/runtime/docs/html/globals_func.html b/runtime/docs/html/globals_func.html
index 051cf88c..1562f9d2 100644
--- a/runtime/docs/html/globals_func.html
+++ b/runtime/docs/html/globals_func.html
@@ -46,7 +46,8 @@
: <a class="el" href="group__io.html#ga2">io.c</a><li>_stp_register_jprobes()
: <a class="el" href="probes_8c.html#a2">probes.c</a><li>_stp_register_kprobes()
: <a class="el" href="probes_8c.html#a4">probes.c</a><li>_stp_ret_addr()
-: <a class="el" href="group__current.html#ga0">current.c</a><li>_stp_strncpy_from_user()
+: <a class="el" href="group__current.html#ga0">current.c</a><li>_stp_stack_print()
+: <a class="el" href="group__stack.html#ga6">stack.c</a><li>_stp_strncpy_from_user()
: <a class="el" href="group__copy.html#ga0">copy.c</a><li>_stp_unregister_jprobes()
: <a class="el" href="probes_8c.html#a1">probes.c</a><li>_stp_unregister_kprobes()
: <a class="el" href="probes_8c.html#a3">probes.c</a><li>_stp_valloc()
diff --git a/runtime/docs/html/group__scbuf.html b/runtime/docs/html/group__scbuf.html
index c5e0d6e0..89033737 100644
--- a/runtime/docs/html/group__scbuf.html
+++ b/runtime/docs/html/group__scbuf.html
@@ -17,29 +17,26 @@
<tr><td class="memItemLeft" nowrap align="right" valign="top">void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__scbuf.html#ga2">_stp_sprint</a> (const char *fmt,...)</td></tr>
<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Sprint into the scratch buffer. <a href="#ga2"></a><br></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ga3" doxytag="scbuf::_stp_sprint_str"></a>
-void&nbsp;</td><td class="memItemRight" valign="bottom"><b>_stp_sprint_str</b> (const char *str)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__scbuf.html#ga3">_stp_sprint_str</a> (const char *str)</td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top">void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__scbuf.html#ga4">_stp_scbuf_clear</a> (void)</td></tr>
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Write a string into the scratch buffer. <a href="#ga3"></a><br></td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">char *&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__scbuf.html#ga4">_stp_scbuf_clear</a> (void)</td></tr>
<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Clear the scratch buffer. <a href="#ga4"></a><br></td></tr>
-<tr><td colspan="2"><br><h2>Variables</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ga0" doxytag="scbuf::_stp_scbuf"></a>
-char&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__scbuf.html#ga0">_stp_scbuf</a> [8191+1]</td></tr>
-
-<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Scratch buffer for printing, building strings, etc. <br></td></tr>
</table>
<hr><a name="_details"></a><h2>Detailed Description</h2>
Scratch Buffer Functions.
<p>
-The scratch buffer is for collecting output before storing in a map, printing, etc. This is a per-cpu static buffer. It is necessary because of the limited stack space available in the kernel. <hr><h2>Function Documentation</h2>
+The scratch buffer is for collecting output before storing in a map, printing, etc. This is a per-cpu static buffer. It is necessary because of the limited stack space available in the kernel. <p>
+<dl compact><dt><b><a class="el" href="todo.html#_todo000008">Todo:</a></b></dt><dd>Need careful review of these to insure safety.</dd></dl>
+<hr><h2>Function Documentation</h2>
<a class="anchor" name="ga4" doxytag="scbuf.c::_stp_scbuf_clear"></a><p>
<table class="mdTable" cellpadding="2" cellspacing="0">
<tr>
<td class="mdRow">
<table cellpadding="0" cellspacing="0" border="0">
<tr>
- <td class="md" nowrap valign="top">void _stp_scbuf_clear </td>
+ <td class="md" nowrap valign="top">char* _stp_scbuf_clear </td>
<td class="md" valign="top">(&nbsp;</td>
<td class="md" nowrap valign="top">void&nbsp;</td>
<td class="mdname1" valign="top" nowrap> </td>
@@ -60,11 +57,12 @@ The scratch buffer is for collecting output before storing in a map, printing, e
<p>
Clear the scratch buffer.
<p>
-Output from <a class="el" href="group__scbuf.html#ga2">_stp_sprint()</a> will accumulate in the buffer until this is called.
+This function should be called before anything is written to the scratch buffer. Output will accumulate in the buffer until this function is called again. <dl compact><dt><b>Returns:</b></dt><dd>A pointer to the buffer. </dd></dl>
+
<p>
-Definition at line <a class="el" href="scbuf_8c-source.html#l00059">59</a> of file <a class="el" href="scbuf_8c-source.html">scbuf.c</a>.
+Definition at line <a class="el" href="scbuf_8c-source.html#l00074">74</a> of file <a class="el" href="scbuf_8c-source.html">scbuf.c</a>.
<p>
-References <a class="el" href="scbuf_8c-source.html#l00018">_stp_scbuf</a>, and <a class="el" href="scbuf_8c-source.html#l00015">STP_BUF_LEN</a>. </td>
+References <a class="el" href="scbuf_8c-source.html#l00017">STP_BUF_LEN</a>. </td>
</tr>
</table>
<a class="anchor" name="ga2" doxytag="scbuf.c::_stp_sprint"></a><p>
@@ -103,7 +101,7 @@ References <a class="el" href="scbuf_8c-source.html#l00018">_stp_scbuf</a>, and
<p>
Sprint into the scratch buffer.
<p>
-Like printf, except output goes into <a class="el" href="group__scbuf.html#ga0">_stp_scbuf</a>, which will contain the null-terminated output. Safe because overflowing <a class="el" href="group__scbuf.html#ga0">_stp_scbuf</a> is not allowed. Size is limited by length of scratch buffer, STP_BUF_LEN.<p>
+Like printf, except output goes into a global scratch buffer which will contain the null-terminated output. Safe because overflowing the buffer is not allowed. Size is limited by length of scratch buffer, STP_BUF_LEN.<p>
<dl compact><dt><b>Parameters:</b></dt><dd>
<table border="0" cellspacing="2" cellpadding="0">
<tr><td valign="top"></td><td valign="top"><em>fmt</em>&nbsp;</td><td>A printf-style format string followed by a variable number of args. </td></tr>
@@ -112,11 +110,51 @@ Like printf, except output goes into <a class="el" href="group__scbuf.html#ga0">
<dl compact><dt><b>See also:</b></dt><dd><a class="el" href="group__scbuf.html#ga4">_stp_scbuf_clear</a> </dd></dl>
<p>
-Definition at line <a class="el" href="scbuf_8c-source.html#l00032">32</a> of file <a class="el" href="scbuf_8c-source.html">scbuf.c</a>.
+Definition at line <a class="el" href="scbuf_8c-source.html#l00034">34</a> of file <a class="el" href="scbuf_8c-source.html">scbuf.c</a>.
<p>
-References <a class="el" href="scbuf_8c-source.html#l00018">_stp_scbuf</a>, and <a class="el" href="scbuf_8c-source.html#l00015">STP_BUF_LEN</a>.
+References <a class="el" href="scbuf_8c-source.html#l00017">STP_BUF_LEN</a>.
<p>
Referenced by <a class="el" href="sym_8c-source.html#l00045">_stp_symbol_sprint()</a>. </td>
</tr>
</table>
+<a class="anchor" name="ga3" doxytag="scbuf.c::_stp_sprint_str"></a><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+ <tr>
+ <td class="mdRow">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td class="md" nowrap valign="top">void _stp_sprint_str </td>
+ <td class="md" valign="top">(&nbsp;</td>
+ <td class="md" nowrap valign="top">const char *&nbsp;</td>
+ <td class="mdname1" valign="top" nowrap> <em>str</em> </td>
+ <td class="md" valign="top">&nbsp;)&nbsp;</td>
+ <td class="md" nowrap></td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+ <tr>
+ <td>
+ &nbsp;
+ </td>
+ <td>
+
+<p>
+Write a string into the scratch buffer.
+<p>
+Copies a string into a global scratch buffer. Safe because overflowing the buffer is not allowed. Size is limited by length of scratch buffer, STP_BUF_LEN. This is more efficient than using <a class="el" href="group__scbuf.html#ga2">_stp_sprint()</a>.<p>
+<dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>str</em>&nbsp;</td><td>A string. </td></tr>
+ </table>
+</dl>
+
+<p>
+Definition at line <a class="el" href="scbuf_8c-source.html#l00056">56</a> of file <a class="el" href="scbuf_8c-source.html">scbuf.c</a>.
+<p>
+References <a class="el" href="scbuf_8c-source.html#l00017">STP_BUF_LEN</a>. </td>
+ </tr>
+</table>
</body></html>
diff --git a/runtime/docs/html/group__stack.html b/runtime/docs/html/group__stack.html
index bf112d0a..159a529f 100644
--- a/runtime/docs/html/group__stack.html
+++ b/runtime/docs/html/group__stack.html
@@ -8,11 +8,58 @@
<h1>Stack Tracing Functions</h1><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
<tr><td colspan="2"><br><h2>Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ga6" doxytag="stack::_stp_stack_print"></a>
-void&nbsp;</td><td class="memItemRight" valign="bottom"><b>_stp_stack_print</b> (int verbose, int levels)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__stack.html#ga6">_stp_stack_print</a> (int verbose, int levels)</td></tr>
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Print stack dump. <a href="#ga6"></a><br></td></tr>
<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ga7" doxytag="stack::_stp_stack_sprint"></a>
char *&nbsp;</td><td class="memItemRight" valign="bottom"><b>_stp_stack_sprint</b> (int verbose, int levels)</td></tr>
</table>
+<hr><h2>Function Documentation</h2>
+<a class="anchor" name="ga6" doxytag="stack.c::_stp_stack_print"></a><p>
+<table class="mdTable" cellpadding="2" cellspacing="0">
+ <tr>
+ <td class="mdRow">
+ <table cellpadding="0" cellspacing="0" border="0">
+ <tr>
+ <td class="md" nowrap valign="top">void _stp_stack_print </td>
+ <td class="md" valign="top">(&nbsp;</td>
+ <td class="md" nowrap valign="top">int&nbsp;</td>
+ <td class="mdname" nowrap> <em>verbose</em>, </td>
+ </tr>
+ <tr>
+ <td class="md" nowrap align="right"></td>
+ <td class="md"></td>
+ <td class="md" nowrap>int&nbsp;</td>
+ <td class="mdname" nowrap> <em>levels</em></td>
+ </tr>
+ <tr>
+ <td class="md"></td>
+ <td class="md">)&nbsp;</td>
+ <td class="md" colspan="2"></td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+</table>
+<table cellspacing="5" cellpadding="0" border="0">
+ <tr>
+ <td>
+ &nbsp;
+ </td>
+ <td>
+
+<p>
+Print stack dump.
+<p>
+Prints a stack dump to the trace buffer. <dl compact><dt><b>Parameters:</b></dt><dd>
+ <table border="0" cellspacing="2" cellpadding="0">
+ <tr><td valign="top"></td><td valign="top"><em>verbose</em>&nbsp;</td><td>Verbosity: </td></tr>
+ </table>
+</dl>
+
+<p>
+Definition at line <a class="el" href="stack_8c-source.html#l00151">151</a> of file <a class="el" href="stack_8c-source.html">stack.c</a>. </td>
+ </tr>
+</table>
</body></html>
diff --git a/runtime/docs/html/group__sym.html b/runtime/docs/html/group__sym.html
index c5301602..eafa03c2 100644
--- a/runtime/docs/html/group__sym.html
+++ b/runtime/docs/html/group__sym.html
@@ -98,7 +98,7 @@ Uses scbuf. </dd></dl>
<p>
Definition at line <a class="el" href="sym_8c-source.html#l00045">45</a> of file <a class="el" href="sym_8c-source.html">sym.c</a>.
<p>
-References <a class="el" href="scbuf_8c-source.html#l00032">_stp_sprint()</a>. </td>
+References <a class="el" href="scbuf_8c-source.html#l00034">_stp_sprint()</a>. </td>
</tr>
</table>
</body></html>
diff --git a/runtime/docs/html/kprobe__where__funct_8c-source.html b/runtime/docs/html/kprobe__where__funct_8c-source.html
index dbe9ac74..7da50eda 100644
--- a/runtime/docs/html/kprobe__where__funct_8c-source.html
+++ b/runtime/docs/html/kprobe__where__funct_8c-source.html
@@ -78,9 +78,9 @@
00069
00070 <span class="comment">/* now walk the hash table and print out all the information */</span>
00071 <a class="code" href="group__maps.html#ga31">foreach</a>(funct_locations, ptr) {
-00072 <a class="code" href="group__scbuf.html#ga4">_stp_scbuf_clear</a>();
+00072 <span class="keywordtype">char</span> *str =<a class="code" href="group__scbuf.html#ga4">_stp_scbuf_clear</a>();
00073 <a class="code" href="group__sym.html#ga2">_stp_symbol_sprint</a> (<a class="code" href="group__maps.html#ga26">key1int</a>(ptr));
-00074 <a class="code" href="group__io.html#ga0">dlog</a>(<span class="stringliteral">"%lld\t0x%p\t(%s)\n"</span>, ptr-&gt;<a class="code" href="structmap__node__int64.html#o1">val</a>, <a class="code" href="group__maps.html#ga26">key1int</a>(ptr), _stp_scbuf);
+00074 <a class="code" href="group__io.html#ga0">dlog</a>(<span class="stringliteral">"%lld\t0x%p\t(%s)\n"</span>, ptr-&gt;<a class="code" href="structmap__node__int64.html#o1">val</a>, <a class="code" href="group__maps.html#ga26">key1int</a>(ptr), str);
00075 }
00076
00077 <a class="code" href="group__maps.html#ga7">_stp_map_del</a>(funct_locations);
diff --git a/runtime/docs/html/scbuf_8c-source.html b/runtime/docs/html/scbuf_8c-source.html
index a9e9ddc8..ffdfaac7 100644
--- a/runtime/docs/html/scbuf_8c-source.html
+++ b/runtime/docs/html/scbuf_8c-source.html
@@ -5,75 +5,99 @@
</head><body>
<!-- Generated by Doxygen 1.4.1 -->
<div class="qindex"><a class="qindex" href="index.html">Main&nbsp;Page</a> | <a class="qindex" href="modules.html">Modules</a> | <a class="qindex" href="annotated.html">Data&nbsp;Structures</a> | <a class="qindex" href="dirs.html">Directories</a> | <a class="qindex" href="files.html">File&nbsp;List</a> | <a class="qindex" href="functions.html">Data&nbsp;Fields</a> | <a class="qindex" href="globals.html">Globals</a> | <a class="qindex" href="pages.html">Related&nbsp;Pages</a></div>
-<h1>scbuf.c</h1><div class="fragment"><pre class="fragment">00001 <span class="preprocessor">#ifndef _SCBUF_C_</span>
-00002 <span class="preprocessor"></span><span class="preprocessor">#define _SCBUF_C_</span>
+<h1>scbuf.c</h1><div class="fragment"><pre class="fragment">00001 <span class="preprocessor">#ifndef _SCBUF_C_ </span><span class="comment">/* -*- linux-c -*- */</span>
+00002 <span class="preprocessor">#define _SCBUF_C_</span>
00003 <span class="preprocessor"></span>
-00004 <span class="comment">/* -*- linux-c -*- */</span><span class="comment"></span>
-00005 <span class="comment">/** @file scbuf.c</span>
-00006 <span class="comment"> * @addtogroup scbuf Scratch Buffer</span>
-00007 <span class="comment"> * Scratch Buffer Functions.</span>
-00008 <span class="comment"> * The scratch buffer is for collecting output before storing in a map,</span>
-00009 <span class="comment"> * printing, etc. This is a per-cpu static buffer. It is necessary because </span>
-00010 <span class="comment"> * of the limited stack space available in the kernel.</span>
-00011 <span class="comment"> * @{</span>
-00012 <span class="comment"> */</span>
-00013 <span class="comment"></span>
-00014 <span class="comment">/** Maximum size of buffer, not including terminating NULL */</span>
-<a name="l00015"></a><a class="code" href="group__scbuf.html#ga6">00015</a> <span class="preprocessor">#define STP_BUF_LEN 8191</span>
-00016 <span class="preprocessor"></span><span class="comment"></span>
-00017 <span class="comment">/** Scratch buffer for printing, building strings, etc */</span>
-<a name="l00018"></a><a class="code" href="group__scbuf.html#ga0">00018</a> <span class="keywordtype">char</span> <a class="code" href="group__scbuf.html#ga0">_stp_scbuf</a>[<a class="code" href="group__scbuf.html#ga6">STP_BUF_LEN</a>+1];
-00019 <span class="keyword">static</span> <span class="keywordtype">int</span> _stp_scbuf_len = <a class="code" href="group__scbuf.html#ga6">STP_BUF_LEN</a>;
-00020 <span class="comment"></span>
-00021 <span class="comment">/** Sprint into the scratch buffer.</span>
-00022 <span class="comment"> * Like printf, except output goes into #_stp_scbuf,</span>
-00023 <span class="comment"> * which will contain the null-terminated output.</span>
-00024 <span class="comment"> * Safe because overflowing #_stp_scbuf is not allowed.</span>
-00025 <span class="comment"> * Size is limited by length of scratch buffer, STP_BUF_LEN.</span>
-00026 <span class="comment"> *</span>
-00027 <span class="comment"> * @param fmt A printf-style format string followed by a </span>
-00028 <span class="comment"> * variable number of args.</span>
-00029 <span class="comment"> * @sa _stp_scbuf_clear</span>
-00030 <span class="comment"> */</span>
-00031
-<a name="l00032"></a><a class="code" href="group__scbuf.html#ga2">00032</a> <span class="keywordtype">void</span> <a class="code" href="group__scbuf.html#ga2">_stp_sprint</a> (<span class="keyword">const</span> <span class="keywordtype">char</span> *fmt, ...)
-00033 {
-00034 <span class="keywordtype">int</span> num;
-00035 va_list args;
-00036 <span class="keywordtype">char</span> *buf = <a class="code" href="group__scbuf.html#ga0">_stp_scbuf</a> + <a class="code" href="group__scbuf.html#ga6">STP_BUF_LEN</a> - _stp_scbuf_len;
-00037 va_start(args, fmt);
-00038 num = vscnprintf(buf, _stp_scbuf_len, fmt, args);
-00039 va_end(args);
-00040 <span class="keywordflow">if</span> (num &gt; 0)
-00041 _stp_scbuf_len -= num;
-00042 }
-00043
-00044 <span class="keywordtype">void</span> _stp_sprint_str (<span class="keyword">const</span> <span class="keywordtype">char</span> *str)
-00045 {
-00046 <span class="keywordtype">char</span> *buf = <a class="code" href="group__scbuf.html#ga0">_stp_scbuf</a> + <a class="code" href="group__scbuf.html#ga6">STP_BUF_LEN</a> - _stp_scbuf_len;
-00047 <span class="keywordtype">int</span> num = strlen (str);
-00048 <span class="keywordflow">if</span> (num &gt; _stp_scbuf_len)
-00049 num = _stp_scbuf_len;
-00050 strncpy (buf, str, num);
-00051 _stp_scbuf_len -= num;
-00052 }
-00053 <span class="comment"></span>
-00054 <span class="comment">/** Clear the scratch buffer.</span>
-00055 <span class="comment"> * Output from _stp_sprint() will accumulate in the buffer</span>
-00056 <span class="comment"> * until this is called.</span>
-00057 <span class="comment"> */</span>
-00058
-<a name="l00059"></a><a class="code" href="group__scbuf.html#ga4">00059</a> <span class="keywordtype">void</span> _stp_scbuf_clear (<span class="keywordtype">void</span>)
-00060 {
-00061 _stp_scbuf_len = <a class="code" href="group__scbuf.html#ga6">STP_BUF_LEN</a>;
-00062 <a class="code" href="group__scbuf.html#ga0">_stp_scbuf</a>[0] = 0;
-00063 }
-00064
-00065 <span class="keyword">static</span> <span class="keywordtype">char</span> *_stp_scbuf_cur (<span class="keywordtype">void</span>)
-00066 {
-00067 <span class="keywordflow">return</span> <a class="code" href="group__scbuf.html#ga0">_stp_scbuf</a> + <a class="code" href="group__scbuf.html#ga6">STP_BUF_LEN</a> - _stp_scbuf_len;
-00068 }
-00069 <span class="comment"></span>
-00070 <span class="comment">/** @} */</span>
-00071 <span class="preprocessor">#endif </span><span class="comment">/* _SCBUF_C_ */</span>
+00004 <span class="preprocessor">#include &lt;linux/config.h&gt;</span>
+00005 <span class="comment"></span>
+00006 <span class="comment">/** @file scbuf.c</span>
+00007 <span class="comment"> * @addtogroup scbuf Scratch Buffer</span>
+00008 <span class="comment"> * Scratch Buffer Functions.</span>
+00009 <span class="comment"> * The scratch buffer is for collecting output before storing in a map,</span>
+00010 <span class="comment"> * printing, etc. This is a per-cpu static buffer. It is necessary because </span>
+00011 <span class="comment"> * of the limited stack space available in the kernel.</span>
+00012 <span class="comment"> * @todo Need careful review of these to insure safety.</span>
+00013 <span class="comment"> * @{</span>
+00014 <span class="comment"> */</span>
+00015 <span class="comment"></span>
+00016 <span class="comment">/** Maximum size of buffer, not including terminating NULL */</span>
+<a name="l00017"></a><a class="code" href="group__scbuf.html#ga6">00017</a> <span class="preprocessor">#define STP_BUF_LEN 8191</span>
+00018 <span class="preprocessor"></span><span class="comment"></span>
+00019 <span class="comment">/** Scratch buffer for printing, building strings, etc */</span>
+00020 <span class="keyword">static</span> <span class="keywordtype">char</span> _stp_scbuf[NR_CPUS][<a class="code" href="group__scbuf.html#ga6">STP_BUF_LEN</a>+1];
+00021 <span class="keyword">static</span> <span class="keywordtype">int</span> _stp_scbuf_len[NR_CPUS];
+00022 <span class="comment"></span>
+00023 <span class="comment">/** Sprint into the scratch buffer.</span>
+00024 <span class="comment"> * Like printf, except output goes into a global scratch buffer</span>
+00025 <span class="comment"> * which will contain the null-terminated output.</span>
+00026 <span class="comment"> * Safe because overflowing the buffer is not allowed.</span>
+00027 <span class="comment"> * Size is limited by length of scratch buffer, STP_BUF_LEN.</span>
+00028 <span class="comment"> *</span>
+00029 <span class="comment"> * @param fmt A printf-style format string followed by a </span>
+00030 <span class="comment"> * variable number of args.</span>
+00031 <span class="comment"> * @sa _stp_scbuf_clear</span>
+00032 <span class="comment"> */</span>
+00033
+<a name="l00034"></a><a class="code" href="group__scbuf.html#ga2">00034</a> <span class="keywordtype">void</span> <a class="code" href="group__scbuf.html#ga2">_stp_sprint</a> (<span class="keyword">const</span> <span class="keywordtype">char</span> *fmt, ...)
+00035 {
+00036 <span class="keywordtype">int</span> num;
+00037 va_list args;
+00038 <span class="keywordtype">int</span> cpu = smp_processor_id();
+00039 <span class="keywordtype">char</span> *buf = _stp_scbuf[cpu] + <a class="code" href="group__scbuf.html#ga6">STP_BUF_LEN</a> - _stp_scbuf_len[cpu];
+00040 va_start(args, fmt);
+00041 num = vscnprintf(buf, _stp_scbuf_len[cpu], fmt, args);
+00042 va_end(args);
+00043 <span class="keywordflow">if</span> (num &gt; 0)
+00044 _stp_scbuf_len[cpu] -= num;
+00045 }
+00046 <span class="comment"></span>
+00047 <span class="comment">/** Write a string into the scratch buffer.</span>
+00048 <span class="comment"> * Copies a string into a global scratch buffer.</span>
+00049 <span class="comment"> * Safe because overflowing the buffer is not allowed.</span>
+00050 <span class="comment"> * Size is limited by length of scratch buffer, STP_BUF_LEN.</span>
+00051 <span class="comment"> * This is more efficient than using _stp_sprint().</span>
+00052 <span class="comment"> *</span>
+00053 <span class="comment"> * @param str A string.</span>
+00054 <span class="comment"> */</span>
+00055
+<a name="l00056"></a><a class="code" href="group__scbuf.html#ga3">00056</a> <span class="keywordtype">void</span> <a class="code" href="group__scbuf.html#ga3">_stp_sprint_str</a> (<span class="keyword">const</span> <span class="keywordtype">char</span> *str)
+00057 {
+00058 <span class="keywordtype">int</span> cpu = smp_processor_id();
+00059 <span class="keywordtype">char</span> *buf = _stp_scbuf[cpu] + <a class="code" href="group__scbuf.html#ga6">STP_BUF_LEN</a> - _stp_scbuf_len[cpu];
+00060 <span class="keywordtype">int</span> num = strlen (str);
+00061 <span class="keywordflow">if</span> (num &gt; _stp_scbuf_len[cpu])
+00062 num = _stp_scbuf_len[cpu];
+00063 strncpy (buf, str, num);
+00064 _stp_scbuf_len[cpu] -= num;
+00065 }
+00066 <span class="comment"></span>
+00067 <span class="comment">/** Clear the scratch buffer.</span>
+00068 <span class="comment"> * This function should be called before anything is written to </span>
+00069 <span class="comment"> * the scratch buffer. Output will accumulate in the buffer</span>
+00070 <span class="comment"> * until this function is called again. </span>
+00071 <span class="comment"> * @returns A pointer to the buffer.</span>
+00072 <span class="comment"> */</span>
+00073
+<a name="l00074"></a><a class="code" href="group__scbuf.html#ga4">00074</a> <span class="keywordtype">char</span> *<a class="code" href="group__scbuf.html#ga4">_stp_scbuf_clear</a> (<span class="keywordtype">void</span>)
+00075 {
+00076 <span class="keywordtype">int</span> cpu = smp_processor_id();
+00077 _stp_scbuf_len[cpu] = <a class="code" href="group__scbuf.html#ga6">STP_BUF_LEN</a>;
+00078 *_stp_scbuf[cpu] = 0;
+00079 <span class="keywordflow">return</span> _stp_scbuf[cpu];
+00080 }
+00081 <span class="comment"></span>
+00082 <span class="comment">/** Get the current top of the scratch buffer.</span>
+00083 <span class="comment"> * This returns the address of the location where</span>
+00084 <span class="comment"> * data will be written next in the scratch buffer.</span>
+00085 <span class="comment"> * @returns A pointer</span>
+00086 <span class="comment"> */</span>
+00087
+00088 <span class="keyword">static</span> <span class="keywordtype">char</span> *_stp_scbuf_cur (<span class="keywordtype">void</span>)
+00089 {
+00090 <span class="keywordtype">int</span> cpu = smp_processor_id();
+00091 <span class="keywordflow">return</span> _stp_scbuf[cpu] + <a class="code" href="group__scbuf.html#ga6">STP_BUF_LEN</a> - _stp_scbuf_len[cpu];
+00092 }
+00093 <span class="comment"></span>
+00094 <span class="comment">/** @} */</span>
+00095 <span class="preprocessor">#endif </span><span class="comment">/* _SCBUF_C_ */</span>
</pre></div></body></html>
diff --git a/runtime/docs/html/stack_8c-source.html b/runtime/docs/html/stack_8c-source.html
index f4df8413..552f51cc 100644
--- a/runtime/docs/html/stack_8c-source.html
+++ b/runtime/docs/html/stack_8c-source.html
@@ -103,7 +103,7 @@
00096 <span class="preprocessor"></span> <span class="keywordflow">while</span> (valid_stack_ptr(tinfo, (<span class="keywordtype">void</span> *)ebp)) {
00097 addr = *(<span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> *)(ebp + 4);
00098 <a class="code" href="group__sym.html#ga2">_stp_symbol_sprint</a> (addr);
-00099 _stp_sprint_str(<span class="stringliteral">"\n"</span>);
+00099 <a class="code" href="group__scbuf.html#ga3">_stp_sprint_str</a>(<span class="stringliteral">"\n"</span>);
00100 ebp = *(<span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> *)ebp;
00101 }
00102 <span class="preprocessor">#else</span>
@@ -111,7 +111,7 @@
00104 addr = *stack++;
00105 <span class="keywordflow">if</span> (_stp_kta (addr)) {
00106 <a class="code" href="group__sym.html#ga2">_stp_symbol_sprint</a> (addr);
-00107 _stp_sprint_str (<span class="stringliteral">"\n"</span>);
+00107 <a class="code" href="group__scbuf.html#ga3">_stp_sprint_str</a> (<span class="stringliteral">"\n"</span>);
00108 }
00109 }
00110 <span class="preprocessor">#endif</span>
@@ -149,21 +149,26 @@
00142 }
00143
00144 <span class="preprocessor">#endif </span><span class="comment">/* i386 */</span>
-00145
-00146 <span class="keywordtype">void</span> _stp_stack_print (<span class="keywordtype">int</span> verbose, <span class="keywordtype">int</span> levels)
-00147 {
-00148 <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> stack;
-00149 <span class="keywordflow">return</span> __stp_stack_print (&amp;stack, verbose, levels);
-00150 }
-00151
-00152 <span class="keywordtype">char</span> *_stp_stack_sprint (<span class="keywordtype">int</span> verbose, <span class="keywordtype">int</span> levels)
-00153 {
-00154 <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> stack;
-00155 <span class="keywordtype">char</span> *ptr = _stp_scbuf_cur();
-00156 __stp_stack_sprint (&amp;stack, verbose, levels);
-00157 <span class="keywordflow">return</span> ptr;
-00158 }
-00159 <span class="comment"></span>
-00160 <span class="comment">/** @} */</span>
-00161 <span class="preprocessor">#endif </span><span class="comment">/* _STACK_C_ */</span>
+00145 <span class="comment"></span>
+00146 <span class="comment">/** Print stack dump.</span>
+00147 <span class="comment"> * Prints a stack dump to the trace buffer.</span>
+00148 <span class="comment"> * @param verbose Verbosity:</span>
+00149 <span class="comment"> */</span>
+00150
+<a name="l00151"></a><a class="code" href="group__stack.html#ga6">00151</a> <span class="keywordtype">void</span> <a class="code" href="group__stack.html#ga6">_stp_stack_print</a> (<span class="keywordtype">int</span> verbose, <span class="keywordtype">int</span> levels)
+00152 {
+00153 <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> stack;
+00154 <span class="keywordflow">return</span> __stp_stack_print (&amp;stack, verbose, levels);
+00155 }
+00156
+00157 <span class="keywordtype">char</span> *_stp_stack_sprint (<span class="keywordtype">int</span> verbose, <span class="keywordtype">int</span> levels)
+00158 {
+00159 <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> stack;
+00160 <span class="keywordtype">char</span> *ptr = _stp_scbuf_cur();
+00161 __stp_stack_sprint (&amp;stack, verbose, levels);
+00162 <span class="keywordflow">return</span> ptr;
+00163 }
+00164 <span class="comment"></span>
+00165 <span class="comment">/** @} */</span>
+00166 <span class="preprocessor">#endif </span><span class="comment">/* _STACK_C_ */</span>
</pre></div></body></html>
diff --git a/runtime/docs/html/stack_8c.html b/runtime/docs/html/stack_8c.html
index 65cb258e..093cc186 100644
--- a/runtime/docs/html/stack_8c.html
+++ b/runtime/docs/html/stack_8c.html
@@ -13,9 +13,9 @@
<a href="stack_8c-source.html">Go to the source code of this file.</a><table border="0" cellpadding="0" cellspacing="0">
<tr><td></td></tr>
<tr><td colspan="2"><br><h2>Functions</h2></td></tr>
-<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ga6" doxytag="stack.c::_stp_stack_print"></a>
-void&nbsp;</td><td class="memItemRight" valign="bottom"><b>_stp_stack_print</b> (int verbose, int levels)</td></tr>
+<tr><td class="memItemLeft" nowrap align="right" valign="top">void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__stack.html#ga6">_stp_stack_print</a> (int verbose, int levels)</td></tr>
+<tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Print stack dump. <a href="group__stack.html#ga6"></a><br></td></tr>
<tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ga7" doxytag="stack.c::_stp_stack_sprint"></a>
char *&nbsp;</td><td class="memItemRight" valign="bottom"><b>_stp_stack_sprint</b> (int verbose, int levels)</td></tr>
diff --git a/runtime/docs/html/structmap__root.html b/runtime/docs/html/structmap__root.html
index d6e95bd6..2a4eb819 100644
--- a/runtime/docs/html/structmap__root.html
+++ b/runtime/docs/html/structmap__root.html
@@ -99,7 +99,7 @@ Definition at line <a class="el" href="map_8h-source.html#l00067">67</a> of file
<p>
this is the creation data saved between the key functions and the set/get functions
<p>
-<dl compact><dt><b><a class="el" href="todo.html#_todo000008">Todo:</a></b></dt><dd>Needs to be per-cpu data for SMP support</dd></dl>
+<dl compact><dt><b><a class="el" href="todo.html#_todo000009">Todo:</a></b></dt><dd>Needs to be per-cpu data for SMP support</dd></dl>
<p>
Definition at line <a class="el" href="map_8h-source.html#l00093">93</a> of file <a class="el" href="map_8h-source.html">map.h</a>.
diff --git a/runtime/docs/html/test4_2dtr_8c-source.html b/runtime/docs/html/test4_2dtr_8c-source.html
index 2847b88a..af19db1a 100644
--- a/runtime/docs/html/test4_2dtr_8c-source.html
+++ b/runtime/docs/html/test4_2dtr_8c-source.html
@@ -13,138 +13,251 @@
00004 <span class="preprocessor">#include &lt;linux/module.h&gt;</span>
00005 <span class="preprocessor">#include &lt;linux/interrupt.h&gt;</span>
00006 <span class="preprocessor">#include &lt;net/sock.h&gt;</span>
-00007
-00008 <span class="preprocessor">#include "<a class="code" href="runtime_8h.html">runtime.h</a>"</span>
-00009 <span class="preprocessor">#include "<a class="code" href="io_8c.html">io.c</a>"</span>
-00010 <span class="preprocessor">#include "<a class="code" href="map_8c.html">map.c</a>"</span>
-00011 <span class="preprocessor">#include "<a class="code" href="probes_8c.html">probes.c</a>"</span>
-00012 <span class="preprocessor">#include "<a class="code" href="stack_8c.html">stack.c</a>"</span>
-00013
-00014 MODULE_DESCRIPTION(<span class="stringliteral">"SystemTap probe: test4"</span>);
-00015 MODULE_AUTHOR(<span class="stringliteral">"Martin Hunt &lt;hunt@redhat.com&gt;"</span>);
-00016
-00017 <span class="keyword">static</span> <span class="keywordtype">char</span> tbuffer[2][50000];
-00018 <span class="keyword">static</span> <span class="keywordtype">void</span> stp_helper(<span class="keywordtype">void</span> *);
-00019 <span class="keyword">static</span> DECLARE_WORK(stp_work, stp_helper, tbuffer);
-00020
-00021 <a class="code" href="structmap__root.html">MAP</a> opens, reads, writes, traces;
-00022 <span class="keyword">static</span> <span class="keywordtype">int</span> bufcount = 0;
-00023
-00024 <span class="keyword">static</span> <span class="keywordtype">void</span> stp_helper (<span class="keywordtype">void</span> *data)
-00025 {
-00026 <a class="code" href="group__io.html#ga0">dlog</a> (<span class="stringliteral">"HELPER\n"</span>);
-00027 }
+00007 <span class="preprocessor">#include &lt;linux/netlink.h&gt;</span>
+00008
+00009 <span class="preprocessor">#include "<a class="code" href="runtime_8h.html">runtime.h</a>"</span>
+00010 <span class="preprocessor">#include "<a class="code" href="io_8c.html">io.c</a>"</span>
+00011 <span class="preprocessor">#include "<a class="code" href="map_8c.html">map.c</a>"</span>
+00012 <span class="preprocessor">#include "<a class="code" href="probes_8c.html">probes.c</a>"</span>
+00013 <span class="preprocessor">#include "<a class="code" href="stack_8c.html">stack.c</a>"</span>
+00014
+00015 MODULE_DESCRIPTION(<span class="stringliteral">"SystemTap probe: test4"</span>);
+00016 MODULE_AUTHOR(<span class="stringliteral">"Martin Hunt &lt;hunt@redhat.com&gt;"</span>);
+00017
+00018 <span class="keyword">static</span> <span class="keywordtype">char</span> tbuffer[2][50000];
+00019 <span class="keyword">static</span> <span class="keywordtype">void</span> stp_helper(<span class="keywordtype">void</span> *);
+00020 <span class="keyword">static</span> DECLARE_WORK(stp_work, stp_helper, tbuffer);
+00021
+00022 <a class="code" href="structmap__root.html">MAP</a> opens, reads, writes, traces;
+00023 <span class="keyword">static</span> <span class="keywordtype">int</span> bufcount = 0;
+00024
+00025 <span class="comment">/* netlink control channel */</span>
+00026 <span class="keyword">static</span> <span class="keyword">struct </span>sock *control;
+00027 <span class="keyword">static</span> <span class="keywordtype">int</span> seq = 0;
00028
-00029 asmlinkage <span class="keywordtype">long</span> inst_sys_open (<span class="keyword">const</span> <span class="keywordtype">char</span> __user * filename, <span class="keywordtype">int</span> flags, <span class="keywordtype">int</span> mode)
-00030 {
-00031 <a class="code" href="group__maps.html#ga12">_stp_map_key_str</a> (opens, current-&gt;comm);
-00032 <a class="code" href="group__maps.html#ga17">_stp_map_add_int64</a> (opens, 1);
-00033 jprobe_return();
-00034 <span class="keywordflow">return</span> 0;
-00035 }
-00036
-00037 asmlinkage ssize_t inst_sys_read (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> fd, <span class="keywordtype">char</span> __user * buf, size_t count)
-00038 {
-00039 <a class="code" href="group__maps.html#ga12">_stp_map_key_str</a> (reads, current-&gt;comm);
-00040 <a class="code" href="group__maps.html#ga23">_stp_map_stat_add</a> (reads, count);
-00041 jprobe_return();
-00042 <span class="keywordflow">return</span> 0;
-00043 }
-00044
-00045 asmlinkage ssize_t inst_sys_write (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> fd, <span class="keyword">const</span> <span class="keywordtype">char</span> __user * buf, size_t count)
-00046 {
-00047 <a class="code" href="group__maps.html#ga12">_stp_map_key_str</a> (writes, current-&gt;comm);
-00048 <a class="code" href="group__maps.html#ga23">_stp_map_stat_add</a> (writes, count);
-00049 jprobe_return();
-00050 <span class="keywordflow">return</span> 0;
-00051 }
+00029 <span class="keywordtype">int</span> pid;
+00030 <span class="comment">/*</span>
+00031 <span class="comment"> * send_reply - send reply to userspace over netlink control channel</span>
+00032 <span class="comment"> */</span>
+00033 <span class="keyword">static</span> <span class="keywordtype">int</span> send_reply(<span class="keywordtype">int</span> type, <span class="keywordtype">void</span> *reply, <span class="keywordtype">int</span> len, <span class="keywordtype">int</span> pid)
+00034 {
+00035 <span class="keyword">struct </span>sk_buff *skb;
+00036 <span class="keyword">struct </span>nlmsghdr *nlh;
+00037 <span class="keywordtype">void</span> *data;
+00038 <span class="keywordtype">int</span> size;
+00039 <span class="keywordtype">int</span> err;
+00040
+00041 size = NLMSG_SPACE(len);
+00042 skb = alloc_skb(size, GFP_KERNEL);
+00043 <span class="keywordflow">if</span> (!skb)
+00044 return -1;
+00045 nlh = NLMSG_PUT(skb, pid, seq++, type, size - sizeof(*nlh));
+00046 nlh-&gt;nlmsg_flags = 0;
+00047 data = NLMSG_DATA(nlh);
+00048 memcpy(data, reply, len);
+00049 err = netlink_unicast(control, skb, pid, MSG_DONTWAIT);
+00050
+00051 return 0;
00052
-00053 <span class="keywordtype">int</span> inst_show_cpuinfo(<span class="keyword">struct</span> seq_file *m, <span class="keywordtype">void</span> *v)
-00054 {
-00055 _stp_stack_print (0,0);
-00056 _stp_stack_print (1,0);
-00057
-00058 <a class="code" href="group__scbuf.html#ga4">_stp_scbuf_clear</a>();
-00059 <a class="code" href="group__lists.html#ga5">_stp_list_add</a> (traces, _stp_stack_sprint(0,0));
-00060 <span class="keywordflow">if</span> (bufcount++ == 0)
-00061 schedule_work (&amp;stp_work);
-00062
-00063 jprobe_return();
-00064 return 0;
-00065 }
-00066
-00067
-00068 static struct jprobe dtr_probes[] = {
-00069 {
-00070 .kp.addr = (kprobe_opcode_t *)<span class="stringliteral">"sys_open"</span>,
-00071 .entry = (kprobe_opcode_t *) inst_sys_open
-00072 },
-00073 {
-00074 .kp.addr = (kprobe_opcode_t *)<span class="stringliteral">"sys_read"</span>,
-00075 .entry = (kprobe_opcode_t *) inst_sys_read
-00076 },
-00077 {
-00078 .kp.addr = (kprobe_opcode_t *)<span class="stringliteral">"sys_write"</span>,
-00079 .entry = (kprobe_opcode_t *) inst_sys_write
-00080 },
-00081 {
-00082 .kp.addr = (kprobe_opcode_t *)<span class="stringliteral">"show_cpuinfo"</span>,
-00083 .entry = (kprobe_opcode_t *) inst_show_cpuinfo,
-00084 },
-00085 };
+00053 nlmsg_failure:
+00054 if (skb)
+00055 kfree_skb(skb);
+00056
+00057 return -1;
+00058 }
+00059
+00060 static <span class="keywordtype">char</span> pbuff[1024];
+00061
+00062 <span class="keywordtype">void</span> nlog (const <span class="keywordtype">char</span> *fmt, ...)
+00063 {
+00064 <span class="keywordtype">int</span> len;
+00065 va_list args;
+00066 va_start(args, fmt);
+00067 len = vscnprintf (pbuff, <span class="keyword">sizeof</span>(pbuff), fmt, args) + 1;
+00068 va_end(args);
+00069 send_reply (42, pbuff, len, pid);
+00070 }
+00071
+00072 <span class="comment">/*</span>
+00073 <span class="comment"> * msg_rcv_skb - dispatch userspace requests from netlink control channel</span>
+00074 <span class="comment"> */</span>
+00075 <span class="keyword">static</span> <span class="keywordtype">void</span> msg_rcv_skb(<span class="keyword">struct</span> sk_buff *skb)
+00076 {
+00077 <span class="keyword">struct </span>nlmsghdr *nlh = NULL;
+00078 <span class="keywordtype">int</span> flags;
+00079 <span class="keywordtype">int</span> nlmsglen, skblen;
+00080 <span class="keywordtype">void</span> *data;
+00081
+00082 skblen = skb-&gt;len;
+00083 <span class="comment">// dlog ("skblen = %d %d\n", skblen, sizeof(*nlh));</span>
+00084 <span class="keywordflow">if</span> (skblen &lt; <span class="keyword">sizeof</span> (*nlh))
+00085 return;
00086
-00087 <span class="preprocessor">#define MAX_DTR_ROUTINE (sizeof(dtr_probes)/sizeof(struct jprobe))</span>
-00088 <span class="preprocessor"></span>
-00089 <span class="keyword">static</span> <span class="keywordtype">int</span> init_dtr(<span class="keywordtype">void</span>)
-00090 {
-00091 <span class="keywordtype">int</span> ret;
-00092
-00093 opens = <a class="code" href="group__maps.html#ga2">_stp_map_new</a> (1000, INT64);
-00094 reads = <a class="code" href="group__maps.html#ga2">_stp_map_new</a> (1000, STAT);
-00095 writes = <a class="code" href="group__maps.html#ga2">_stp_map_new</a> (1000, STAT);
-00096 traces = <a class="code" href="group__lists.html#ga0">_stp_list_new</a> (1000, STRING);
-00097
-00098 ret = <a class="code" href="probes_8c.html#a2">_stp_register_jprobes</a> (dtr_probes, MAX_DTR_ROUTINE);
-00099
-00100 <a class="code" href="group__io.html#ga0">dlog</a>(<span class="stringliteral">"instrumentation is enabled...\n"</span>);
-00101 <span class="keywordflow">return</span> ret;
+00087 nlh = (struct nlmsghdr *)skb-&gt;data;
+00088 nlmsglen = nlh-&gt;nlmsg_len;
+00089
+00090 <span class="comment">// dlog ("nlmsghlen=%d\n", nlmsglen);</span>
+00091 if (nlmsglen &lt; sizeof(*nlh) || skblen &lt; nlmsglen)
+00092 return;
+00093
+00094 pid = nlh-&gt;nlmsg_pid;
+00095 flags = nlh-&gt;nlmsg_flags;
+00096
+00097 <span class="comment">// dlog ("pid=%d flags=%x %x %x %x\n", pid, flags, NLM_F_REQUEST, MSG_TRUNC, NLM_F_ACK);</span>
+00098 if (pid &lt;= 0 || !(flags &amp; NLM_F_REQUEST)) {
+00099 netlink_ack(skb, nlh, -EINVAL);
+00100 <span class="keywordflow">return</span>;
+00101 }
00102
-00103 }
-00104
-00105 <span class="keyword">static</span> <span class="keywordtype">void</span> cleanup_dtr(<span class="keywordtype">void</span>)
-00106 {
-00107 <span class="keyword">struct </span><a class="code" href="structmap__node__stat.html">map_node_stat</a> *st;
-00108 <span class="keyword">struct </span><a class="code" href="structmap__node__int64.html">map_node_int64</a> *ptr;
-00109 <span class="keyword">struct </span><a class="code" href="structmap__node__str.html">map_node_str</a> *sptr;
-00110
-00111 <a class="code" href="probes_8c.html#a1">_stp_unregister_jprobes</a> (dtr_probes, MAX_DTR_ROUTINE);
-00112
-00113 <a class="code" href="group__maps.html#ga31">foreach</a> (traces, sptr)
-00114 dlog ("trace: %s\n", sptr-&gt;str);
-00115
-00116 foreach (opens, ptr)
-00117 dlog ("opens[%s] = %lld\n", key1str(ptr), ptr-&gt;val);
-00118 dlog ("\n");
-00119
-00120 foreach (reads, st)
-00121 dlog ("reads[%s] = [count=%lld sum=%lld min=%lld max=%lld]\n", key1str(st),
-00122 st-&gt;stats.count, st-&gt;stats.sum, st-&gt;stats.min, st-&gt;stats.max);
-00123 dlog ("\n");
-00124
-00125 foreach (writes, st)
-00126 dlog ("writes[%s] = [count=%lld sum=%lld min=%lld max=%lld]\n", key1str(st),
-00127 st-&gt;stats.count, st-&gt;stats.sum, st-&gt;stats.min, st-&gt;stats.max);
-00128 dlog ("\n");
-00129
-00130 _stp_map_del (opens);
-00131 _stp_map_del (reads);
-00132 _stp_map_del (writes);
-00133
-00134 dlog("EXIT\n");
-00135 }
-00136
-00137 module_init(init_dtr);
-00138 module_exit(cleanup_dtr);
-00139 MODULE_LICENSE("GPL");
+00103 <span class="keywordflow">if</span> (flags &amp; MSG_TRUNC) {
+00104 netlink_ack(skb, nlh, -ECOMM);
+00105 <span class="keywordflow">return</span>;
+00106 }
+00107
+00108 data = NLMSG_DATA(nlh);
+00109
+00110 <span class="comment">// dlog ("NETLINK: Got message \"%s\" of type %d from pid %d\n", data, nlh-&gt;nlmsg_type,pid);</span>
+00111
+00112 <span class="keywordflow">if</span> (flags &amp; NLM_F_ACK)
+00113 netlink_ack(skb, nlh, 0);
+00114
+00115 send_reply (42, "Howdy Partner", 14, pid);
+00116 }
+00117
+00118 static <span class="keywordtype">void</span> msg_rcv(struct sock *sk, <span class="keywordtype">int</span> len)
+00119 {
+00120 <span class="keyword">struct </span>sk_buff *skb;
+00121 <a class="code" href="group__io.html#ga0">dlog</a> (<span class="stringliteral">"netlink message received\n"</span>);
+00122 <span class="keywordflow">while</span> ((skb = skb_dequeue(&amp;sk-&gt;sk_receive_queue))) {
+00123 msg_rcv_skb(skb);
+00124 kfree_skb(skb);
+00125 }
+00126 }
+00127
+00128 <span class="keyword">static</span> <span class="keywordtype">void</span> stp_helper (<span class="keywordtype">void</span> *data)
+00129 {
+00130 <a class="code" href="group__io.html#ga0">dlog</a> (<span class="stringliteral">"HELPER\n"</span>);
+00131 }
+00132
+00133 asmlinkage <span class="keywordtype">long</span> inst_sys_open (<span class="keyword">const</span> <span class="keywordtype">char</span> __user * filename, <span class="keywordtype">int</span> flags, <span class="keywordtype">int</span> mode)
+00134 {
+00135 <a class="code" href="group__maps.html#ga12">_stp_map_key_str</a> (opens, current-&gt;comm);
+00136 <a class="code" href="group__maps.html#ga17">_stp_map_add_int64</a> (opens, 1);
+00137 jprobe_return();
+00138 <span class="keywordflow">return</span> 0;
+00139 }
00140
+00141 asmlinkage ssize_t inst_sys_read (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> fd, <span class="keywordtype">char</span> __user * buf, size_t count)
+00142 {
+00143 <a class="code" href="group__maps.html#ga12">_stp_map_key_str</a> (reads, current-&gt;comm);
+00144 <a class="code" href="group__maps.html#ga23">_stp_map_stat_add</a> (reads, count);
+00145 jprobe_return();
+00146 <span class="keywordflow">return</span> 0;
+00147 }
+00148
+00149 asmlinkage ssize_t inst_sys_write (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> fd, <span class="keyword">const</span> <span class="keywordtype">char</span> __user * buf, size_t count)
+00150 {
+00151 <a class="code" href="group__maps.html#ga12">_stp_map_key_str</a> (writes, current-&gt;comm);
+00152 <a class="code" href="group__maps.html#ga23">_stp_map_stat_add</a> (writes, count);
+00153 jprobe_return();
+00154 <span class="keywordflow">return</span> 0;
+00155 }
+00156
+00157 <span class="keywordtype">int</span> inst_show_cpuinfo(<span class="keyword">struct</span> seq_file *m, <span class="keywordtype">void</span> *v)
+00158 {
+00159 <a class="code" href="group__stack.html#ga6">_stp_stack_print</a> (0,0);
+00160 <a class="code" href="group__stack.html#ga6">_stp_stack_print</a> (1,0);
+00161
+00162 <a class="code" href="group__scbuf.html#ga4">_stp_scbuf_clear</a>();
+00163 <a class="code" href="group__lists.html#ga5">_stp_list_add</a> (traces, _stp_stack_sprint(0,0));
+00164 <span class="keywordflow">if</span> (bufcount++ == 0)
+00165 schedule_work (&amp;stp_work);
+00166
+00167 jprobe_return();
+00168 return 0;
+00169 }
+00170
+00171
+00172 static struct jprobe dtr_probes[] = {
+00173 {
+00174 .kp.addr = (kprobe_opcode_t *)<span class="stringliteral">"sys_open"</span>,
+00175 .entry = (kprobe_opcode_t *) inst_sys_open
+00176 },
+00177 {
+00178 .kp.addr = (kprobe_opcode_t *)<span class="stringliteral">"sys_read"</span>,
+00179 .entry = (kprobe_opcode_t *) inst_sys_read
+00180 },
+00181 {
+00182 .kp.addr = (kprobe_opcode_t *)<span class="stringliteral">"sys_write"</span>,
+00183 .entry = (kprobe_opcode_t *) inst_sys_write
+00184 },
+00185 {
+00186 .kp.addr = (kprobe_opcode_t *)<span class="stringliteral">"show_cpuinfo"</span>,
+00187 .entry = (kprobe_opcode_t *) inst_show_cpuinfo,
+00188 },
+00189 };
+00190
+00191 <span class="preprocessor">#define MAX_DTR_ROUTINE (sizeof(dtr_probes)/sizeof(struct jprobe))</span>
+00192 <span class="preprocessor"></span>
+00193 <span class="keyword">static</span> <span class="keywordtype">int</span> init_dtr(<span class="keywordtype">void</span>)
+00194 {
+00195 <span class="keywordtype">int</span> ret;
+00196
+00197 control = netlink_kernel_create(31, msg_rcv);
+00198 <span class="keywordflow">if</span> (!control) {
+00199 <a class="code" href="group__io.html#ga0">dlog</a> (<span class="stringliteral">"Couldn't create netlink channel\n"</span>);
+00200 <span class="keywordflow">return</span> -1;
+00201 }
+00202
+00203 opens = <a class="code" href="group__maps.html#ga2">_stp_map_new</a> (1000, INT64);
+00204 reads = <a class="code" href="group__maps.html#ga2">_stp_map_new</a> (1000, STAT);
+00205 writes = <a class="code" href="group__maps.html#ga2">_stp_map_new</a> (1000, STAT);
+00206 traces = <a class="code" href="group__lists.html#ga0">_stp_list_new</a> (1000, STRING);
+00207
+00208 ret = <a class="code" href="probes_8c.html#a2">_stp_register_jprobes</a> (dtr_probes, MAX_DTR_ROUTINE);
+00209
+00210 <a class="code" href="group__io.html#ga0">dlog</a>(<span class="stringliteral">"instrumentation is enabled...\n"</span>);
+00211 <span class="keywordflow">return</span> ret;
+00212
+00213 }
+00214
+00215 <span class="keyword">static</span> <span class="keywordtype">void</span> cleanup_dtr(<span class="keywordtype">void</span>)
+00216 {
+00217 <span class="keyword">struct </span><a class="code" href="structmap__node__stat.html">map_node_stat</a> *st;
+00218 <span class="keyword">struct </span><a class="code" href="structmap__node__int64.html">map_node_int64</a> *ptr;
+00219 <span class="keyword">struct </span><a class="code" href="structmap__node__str.html">map_node_str</a> *sptr;
+00220
+00221 <a class="code" href="probes_8c.html#a1">_stp_unregister_jprobes</a> (dtr_probes, MAX_DTR_ROUTINE);
+00222
+00223 <a class="code" href="group__maps.html#ga31">foreach</a> (traces, sptr)
+00224 nlog ("trace: %s\n", sptr-&gt;str);
+00225
+00226 foreach (opens, ptr)
+00227 nlog ("opens[%s] = %lld\n", key1str(ptr), ptr-&gt;val);
+00228 nlog ("\n");
+00229
+00230 foreach (reads, st)
+00231 nlog ("reads[%s] = [count=%lld sum=%lld min=%lld max=%lld]\n", key1str(st),
+00232 st-&gt;stats.count, st-&gt;stats.sum, st-&gt;stats.min, st-&gt;stats.max);
+00233 nlog ("\n");
+00234
+00235 foreach (writes, st)
+00236 nlog ("writes[%s] = [count=%lld sum=%lld min=%lld max=%lld]\n", key1str(st),
+00237 st-&gt;stats.count, st-&gt;stats.sum, st-&gt;stats.min, st-&gt;stats.max);
+00238 nlog ("\n");
+00239
+00240 _stp_map_del (opens);
+00241 _stp_map_del (reads);
+00242 _stp_map_del (writes);
+00243
+00244 if (control)
+00245 sock_release(control-&gt;sk_socket);
+00246
+00247 dlog("EXIT\n");
+00248 }
+00249
+00250 module_init(init_dtr);
+00251 module_exit(cleanup_dtr);
+00252 MODULE_LICENSE("GPL");
+00253
</pre></div></body></html>
diff --git a/runtime/docs/html/todo.html b/runtime/docs/html/todo.html
index 7435d106..22265a06 100644
--- a/runtime/docs/html/todo.html
+++ b/runtime/docs/html/todo.html
@@ -5,7 +5,7 @@
</head><body>
<!-- Generated by Doxygen 1.4.1 -->
<div class="qindex"><a class="qindex" href="index.html">Main&nbsp;Page</a> | <a class="qindex" href="modules.html">Modules</a> | <a class="qindex" href="annotated.html">Data&nbsp;Structures</a> | <a class="qindex" href="dirs.html">Directories</a> | <a class="qindex" href="files.html">File&nbsp;List</a> | <a class="qindex" href="functions.html">Data&nbsp;Fields</a> | <a class="qindex" href="globals.html">Globals</a> | <a class="qindex" href="pages.html">Related&nbsp;Pages</a></div>
-<h1><a class="anchor" name="todo">Todo List</a></h1><a class="anchor" name="_todo000008"></a> <dl>
+<h1><a class="anchor" name="todo">Todo List</a></h1><a class="anchor" name="_todo000009"></a> <dl>
<dt>Global <a class="el" href="structmap__root.html#o7">map_root::create</a> </dt>
<dd>Needs to be per-cpu data for SMP support</dd>
</dl>
@@ -44,4 +44,9 @@
<dt>Global <a class="el" href="group__maps.html#ga23">_stp_map_stat_add</a> (MAP map, int64_t val) </dt>
<dd>Histograms don't work yet. </dd>
</dl>
+<p>
+<a class="anchor" name="_todo000008"></a> <dl>
+<dt>Group <a class="el" href="group__scbuf.html">scbuf</a> </dt>
+<dd>Need careful review of these to insure safety.</dd>
+</dl>
</body></html>