a00159.html 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251
  1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
  2. <html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
  3. <title>uIP 1.0: Memory block management functions</title>
  4. <link href="doxygen.css" rel="stylesheet" type="text/css">
  5. <link href="tabs.css" rel="stylesheet" type="text/css">
  6. </head><body>
  7. <!-- Generated by Doxygen 1.4.6 -->
  8. <div class="tabs">
  9. <ul>
  10. <li><a href="main.html"><span>Main&nbsp;Page</span></a></li>
  11. <li><a href="modules.html"><span>Modules</span></a></li>
  12. <li><a href="classes.html"><span>Data&nbsp;Structures</span></a></li>
  13. <li><a href="files.html"><span>Files</span></a></li>
  14. <li><a href="examples.html"><span>Examples</span></a></li>
  15. </ul></div>
  16. <h1>Memory block management functions</h1><hr><a name="_details"></a><h2>Detailed Description</h2>
  17. The memory block allocation routines provide a simple yet powerful set of functions for managing a set of memory blocks of fixed size.
  18. <p>
  19. A set of memory blocks is statically declared with the <a class="el" href="a00159.html#gf31774d02a69fd3f1c2b282454438cba">MEMB()</a> macro. Memory blocks are allocated from the declared memory by the <a class="el" href="a00159.html#gfe5e93119035e14cc485760a176249ba">memb_alloc()</a> function, and are deallocated with the <a class="el" href="a00159.html#gceb952d27de8125d5146ac0bee325b8f">memb_free()</a> function.<p>
  20. <dl compact><dt><b>Note:</b></dt><dd>Because of namespace clashes only one <a class="el" href="a00159.html#gf31774d02a69fd3f1c2b282454438cba">MEMB()</a> can be declared per C module, and the name scope of a <a class="el" href="a00159.html#gf31774d02a69fd3f1c2b282454438cba">MEMB()</a> memory block is local to each C module.</dd></dl>
  21. The following example shows how to declare and use a memory block called "cmem" which has 8 chunks of memory with each memory chunk being 20 bytes large.
  22. <p>
  23. <table border="0" cellpadding="0" cellspacing="0">
  24. <tr><td></td></tr>
  25. <tr><td colspan="2"><br><h2>Files</h2></td></tr>
  26. <tr><td class="memItemLeft" nowrap align="right" valign="top">file &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00120.html">memb.c</a></td></tr>
  27. <tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Memory block allocation routines. <br></td></tr>
  28. <p>
  29. <tr><td class="memItemLeft" nowrap align="right" valign="top">file &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00121.html">memb.h</a></td></tr>
  30. <tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Memory block allocation routines. <br></td></tr>
  31. <p>
  32. <tr><td colspan="2"><br><h2>Data Structures</h2></td></tr>
  33. <tr><td class="memItemLeft" nowrap align="right" valign="top">struct &nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00081.html">memb_blocks</a></td></tr>
  34. <tr><td colspan="2"><br><h2>Defines</h2></td></tr>
  35. <tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="ga680bc3f3a1a8a6aec20fe729d138cb8"></a><!-- doxytag: member="memb::MEMB_CONCAT2" ref="ga680bc3f3a1a8a6aec20fe729d138cb8" args="(s1, s2)" -->
  36. #define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00159.html#ga680bc3f3a1a8a6aec20fe729d138cb8">MEMB_CONCAT2</a>(s1, s2)&nbsp;&nbsp;&nbsp;s1##s2</td></tr>
  37. <tr><td class="memItemLeft" nowrap align="right" valign="top"><a class="anchor" name="g720ac440c7b24bdd07c53ba146e36fb2"></a><!-- doxytag: member="memb::MEMB_CONCAT" ref="g720ac440c7b24bdd07c53ba146e36fb2" args="(s1, s2)" -->
  38. #define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00159.html#g720ac440c7b24bdd07c53ba146e36fb2">MEMB_CONCAT</a>(s1, s2)&nbsp;&nbsp;&nbsp;MEMB_CONCAT2(s1, s2)</td></tr>
  39. <tr><td class="memItemLeft" nowrap align="right" valign="top">#define&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00159.html#gf31774d02a69fd3f1c2b282454438cba">MEMB</a>(name, structure, num)</td></tr>
  40. <tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Declare a memory block. <a href="#gf31774d02a69fd3f1c2b282454438cba"></a><br></td></tr>
  41. <tr><td colspan="2"><br><h2>Functions</h2></td></tr>
  42. <tr><td class="memItemLeft" nowrap align="right" valign="top">void&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00159.html#gd58a6c7e62ae59bf7a016ded12ca2910">memb_init</a> (struct <a class="el" href="a00081.html">memb_blocks</a> *m)</td></tr>
  43. <tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Initialize a memory block that was declared with <a class="el" href="a00159.html#gf31774d02a69fd3f1c2b282454438cba">MEMB()</a>. <a href="#gd58a6c7e62ae59bf7a016ded12ca2910"></a><br></td></tr>
  44. <tr><td class="memItemLeft" nowrap align="right" valign="top">void *&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00159.html#gfe5e93119035e14cc485760a176249ba">memb_alloc</a> (struct <a class="el" href="a00081.html">memb_blocks</a> *m)</td></tr>
  45. <tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Allocate a memory block from a block of memory declared with <a class="el" href="a00159.html#gf31774d02a69fd3f1c2b282454438cba">MEMB()</a>. <a href="#gfe5e93119035e14cc485760a176249ba"></a><br></td></tr>
  46. <tr><td class="memItemLeft" nowrap align="right" valign="top">char&nbsp;</td><td class="memItemRight" valign="bottom"><a class="el" href="a00159.html#gceb952d27de8125d5146ac0bee325b8f">memb_free</a> (struct <a class="el" href="a00081.html">memb_blocks</a> *m, void *ptr)</td></tr>
  47. <tr><td class="mdescLeft">&nbsp;</td><td class="mdescRight">Deallocate a memory block from a memory block previously declared with <a class="el" href="a00159.html#gf31774d02a69fd3f1c2b282454438cba">MEMB()</a>. <a href="#gceb952d27de8125d5146ac0bee325b8f"></a><br></td></tr>
  48. </table>
  49. <hr><h2>Define Documentation</h2>
  50. <a class="anchor" name="gf31774d02a69fd3f1c2b282454438cba"></a><!-- doxytag: member="memb.h::MEMB" ref="gf31774d02a69fd3f1c2b282454438cba" args="(name, structure, num)" --><p>
  51. <table class="mdTable" cellpadding="2" cellspacing="0">
  52. <tr>
  53. <td class="mdRow">
  54. <table cellpadding="0" cellspacing="0" border="0">
  55. <tr>
  56. <td class="md" nowrap valign="top">#define MEMB </td>
  57. <td class="md" valign="top">(&nbsp;</td>
  58. <td class="md" nowrap valign="top">name, <tr>
  59. <td class="md" nowrap align="right"></td>
  60. <td class="md"></td>
  61. <td class="md" nowrap>structure, <tr>
  62. <td class="md" nowrap align="right"></td>
  63. <td class="md"></td>
  64. <td class="md" nowrap>num&nbsp;</td>
  65. <td class="mdname1" valign="top" nowrap> </td>
  66. <td class="md" valign="top">&nbsp;)&nbsp;</td>
  67. <td class="md" nowrap></td>
  68. </tr>
  69. </table>
  70. </td>
  71. </tr>
  72. </table>
  73. <table cellspacing="5" cellpadding="0" border="0">
  74. <tr>
  75. <td>
  76. &nbsp;
  77. </td>
  78. <td>
  79. <p>
  80. <b>Value:</b><div class="fragment"><pre class="fragment"><span class="keyword">static</span> <span class="keywordtype">char</span> <a class="code" href="a00159.html#g720ac440c7b24bdd07c53ba146e36fb2">MEMB_CONCAT</a>(name,_memb_count)[num]; \
  81. <span class="keyword">static</span> structure <a class="code" href="a00159.html#g720ac440c7b24bdd07c53ba146e36fb2">MEMB_CONCAT</a>(name,_memb_mem)[num]; \
  82. <span class="keyword">static</span> <span class="keyword">struct </span><a class="code" href="a00081.html">memb_blocks</a> name = {<span class="keyword">sizeof</span>(structure), <a class="code" href="a00081.html#164124d48fe85bc98d9a300382a5245d">num</a>, \
  83. <a class="code" href="a00159.html#g720ac440c7b24bdd07c53ba146e36fb2">MEMB_CONCAT</a>(name,_memb_count), \
  84. (<span class="keywordtype">void</span> *)<a class="code" href="a00159.html#g720ac440c7b24bdd07c53ba146e36fb2">MEMB_CONCAT</a>(name,_memb_mem)}
  85. </pre></div>Declare a memory block.
  86. <p>
  87. This macro is used to staticall declare a block of memory that can be used by the block allocation functions. The macro statically declares a C array with a size that matches the specified number of blocks and their individual sizes.<p>
  88. Example: <div class="fragment"><pre class="fragment"><a class="code" href="a00159.html#gf31774d02a69fd3f1c2b282454438cba">MEMB</a>(connections, <span class="keyword">sizeof</span>(<span class="keyword">struct</span> connection), 16);
  89. </pre></div><p>
  90. <dl compact><dt><b>Parameters:</b></dt><dd>
  91. <table border="0" cellspacing="2" cellpadding="0">
  92. <tr><td valign="top"></td><td valign="top"><em>name</em>&nbsp;</td><td>The name of the memory block (later used with <a class="el" href="a00159.html#gd58a6c7e62ae59bf7a016ded12ca2910">memb_init()</a>, <a class="el" href="a00159.html#gfe5e93119035e14cc485760a176249ba">memb_alloc()</a> and <a class="el" href="a00159.html#gceb952d27de8125d5146ac0bee325b8f">memb_free()</a>).</td></tr>
  93. <tr><td valign="top"></td><td valign="top"><em>size</em>&nbsp;</td><td>The size of each memory chunk, in bytes.</td></tr>
  94. <tr><td valign="top"></td><td valign="top"><em>num</em>&nbsp;</td><td>The total number of memory chunks in the block. </td></tr>
  95. </table>
  96. </dl>
  97. <dl compact><dt><b>Examples: </b></dt><dd>
  98. <a class="el" href="a00044.html#a206">telnetd.c</a>.</dl>
  99. <p>
  100. Definition at line <a class="el" href="a00187.html#l00098">98</a> of file <a class="el" href="a00187.html">memb.h</a>. </td>
  101. </tr>
  102. </table>
  103. <hr><h2>Function Documentation</h2>
  104. <a class="anchor" name="gfe5e93119035e14cc485760a176249ba"></a><!-- doxytag: member="memb.c::memb_alloc" ref="gfe5e93119035e14cc485760a176249ba" args="(struct memb_blocks *m)" --><p>
  105. <table class="mdTable" cellpadding="2" cellspacing="0">
  106. <tr>
  107. <td class="mdRow">
  108. <table cellpadding="0" cellspacing="0" border="0">
  109. <tr>
  110. <td class="md" nowrap valign="top">void * memb_alloc </td>
  111. <td class="md" valign="top">(&nbsp;</td>
  112. <td class="md" nowrap valign="top">struct <a class="el" href="a00081.html">memb_blocks</a> *&nbsp;</td>
  113. <td class="mdname1" valign="top" nowrap> <em>m</em> </td>
  114. <td class="md" valign="top">&nbsp;)&nbsp;</td>
  115. <td class="md" nowrap></td>
  116. </tr>
  117. </table>
  118. </td>
  119. </tr>
  120. </table>
  121. <table cellspacing="5" cellpadding="0" border="0">
  122. <tr>
  123. <td>
  124. &nbsp;
  125. </td>
  126. <td>
  127. <p>
  128. Allocate a memory block from a block of memory declared with <a class="el" href="a00159.html#gf31774d02a69fd3f1c2b282454438cba">MEMB()</a>.
  129. <p>
  130. <dl compact><dt><b>Parameters:</b></dt><dd>
  131. <table border="0" cellspacing="2" cellpadding="0">
  132. <tr><td valign="top"></td><td valign="top"><em>m</em>&nbsp;</td><td>A memory block previosly declared with <a class="el" href="a00159.html#gf31774d02a69fd3f1c2b282454438cba">MEMB()</a>. </td></tr>
  133. </table>
  134. </dl>
  135. <dl compact><dt><b>Examples: </b></dt><dd>
  136. <a class="el" href="a00044.html#a208">telnetd.c</a>.</dl>
  137. <p>
  138. Definition at line <a class="el" href="a00186.html#l00059">59</a> of file <a class="el" href="a00186.html">memb.c</a>.
  139. <p>
  140. References <a class="el" href="a00187.html#l00108">memb_blocks::count</a>, <a class="el" href="a00187.html#l00109">memb_blocks::mem</a>, <a class="el" href="a00187.html#l00107">memb_blocks::num</a>, and <a class="el" href="a00187.html#l00106">memb_blocks::size</a>. </td>
  141. </tr>
  142. </table>
  143. <a class="anchor" name="gceb952d27de8125d5146ac0bee325b8f"></a><!-- doxytag: member="memb.c::memb_free" ref="gceb952d27de8125d5146ac0bee325b8f" args="(struct memb_blocks *m, void *ptr)" --><p>
  144. <table class="mdTable" cellpadding="2" cellspacing="0">
  145. <tr>
  146. <td class="mdRow">
  147. <table cellpadding="0" cellspacing="0" border="0">
  148. <tr>
  149. <td class="md" nowrap valign="top">char memb_free </td>
  150. <td class="md" valign="top">(&nbsp;</td>
  151. <td class="md" nowrap valign="top">struct <a class="el" href="a00081.html">memb_blocks</a> *&nbsp;</td>
  152. <td class="mdname" nowrap> <em>m</em>, </td>
  153. </tr>
  154. <tr>
  155. <td class="md" nowrap align="right"></td>
  156. <td class="md"></td>
  157. <td class="md" nowrap>void *&nbsp;</td>
  158. <td class="mdname" nowrap> <em>ptr</em></td>
  159. </tr>
  160. <tr>
  161. <td class="md"></td>
  162. <td class="md">)&nbsp;</td>
  163. <td class="md" colspan="2"></td>
  164. </tr>
  165. </table>
  166. </td>
  167. </tr>
  168. </table>
  169. <table cellspacing="5" cellpadding="0" border="0">
  170. <tr>
  171. <td>
  172. &nbsp;
  173. </td>
  174. <td>
  175. <p>
  176. Deallocate a memory block from a memory block previously declared with <a class="el" href="a00159.html#gf31774d02a69fd3f1c2b282454438cba">MEMB()</a>.
  177. <p>
  178. <dl compact><dt><b>Parameters:</b></dt><dd>
  179. <table border="0" cellspacing="2" cellpadding="0">
  180. <tr><td valign="top"></td><td valign="top"><em>m</em>&nbsp;</td><td>m A memory block previosly declared with <a class="el" href="a00159.html#gf31774d02a69fd3f1c2b282454438cba">MEMB()</a>.</td></tr>
  181. <tr><td valign="top"></td><td valign="top"><em>ptr</em>&nbsp;</td><td>A pointer to the memory block that is to be deallocated.</td></tr>
  182. </table>
  183. </dl>
  184. <dl compact><dt><b>Returns:</b></dt><dd>The new reference count for the memory block (should be 0 if successfully deallocated) or -1 if the pointer "ptr" did not point to a legal memory block. </dd></dl>
  185. <dl compact><dt><b>Examples: </b></dt><dd>
  186. <a class="el" href="a00044.html#a209">telnetd.c</a>.</dl>
  187. <p>
  188. Definition at line <a class="el" href="a00186.html#l00079">79</a> of file <a class="el" href="a00186.html">memb.c</a>.
  189. <p>
  190. References <a class="el" href="a00187.html#l00108">memb_blocks::count</a>, <a class="el" href="a00187.html#l00109">memb_blocks::mem</a>, and <a class="el" href="a00187.html#l00106">memb_blocks::size</a>. </td>
  191. </tr>
  192. </table>
  193. <a class="anchor" name="gd58a6c7e62ae59bf7a016ded12ca2910"></a><!-- doxytag: member="memb.c::memb_init" ref="gd58a6c7e62ae59bf7a016ded12ca2910" args="(struct memb_blocks *m)" --><p>
  194. <table class="mdTable" cellpadding="2" cellspacing="0">
  195. <tr>
  196. <td class="mdRow">
  197. <table cellpadding="0" cellspacing="0" border="0">
  198. <tr>
  199. <td class="md" nowrap valign="top">void memb_init </td>
  200. <td class="md" valign="top">(&nbsp;</td>
  201. <td class="md" nowrap valign="top">struct <a class="el" href="a00081.html">memb_blocks</a> *&nbsp;</td>
  202. <td class="mdname1" valign="top" nowrap> <em>m</em> </td>
  203. <td class="md" valign="top">&nbsp;)&nbsp;</td>
  204. <td class="md" nowrap></td>
  205. </tr>
  206. </table>
  207. </td>
  208. </tr>
  209. </table>
  210. <table cellspacing="5" cellpadding="0" border="0">
  211. <tr>
  212. <td>
  213. &nbsp;
  214. </td>
  215. <td>
  216. <p>
  217. Initialize a memory block that was declared with <a class="el" href="a00159.html#gf31774d02a69fd3f1c2b282454438cba">MEMB()</a>.
  218. <p>
  219. <dl compact><dt><b>Parameters:</b></dt><dd>
  220. <table border="0" cellspacing="2" cellpadding="0">
  221. <tr><td valign="top"></td><td valign="top"><em>m</em>&nbsp;</td><td>A memory block previosly declared with <a class="el" href="a00159.html#gf31774d02a69fd3f1c2b282454438cba">MEMB()</a>. </td></tr>
  222. </table>
  223. </dl>
  224. <dl compact><dt><b>Examples: </b></dt><dd>
  225. <a class="el" href="a00044.html#a220">telnetd.c</a>.</dl>
  226. <p>
  227. Definition at line <a class="el" href="a00186.html#l00052">52</a> of file <a class="el" href="a00186.html">memb.c</a>.
  228. <p>
  229. References <a class="el" href="a00187.html#l00108">memb_blocks::count</a>, <a class="el" href="a00187.html#l00109">memb_blocks::mem</a>, <a class="el" href="a00187.html#l00107">memb_blocks::num</a>, and <a class="el" href="a00187.html#l00106">memb_blocks::size</a>. </td>
  230. </tr>
  231. </table>
  232. <hr size="1"><address style="align: right;"><small>Generated on Mon Jun 12 10:23:02 2006 for uIP 1.0 by&nbsp;
  233. <a href="http://www.doxygen.org/index.html">
  234. <img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.4.6 </small></address>
  235. </body>
  236. </html>