Current File : //usr/share/doc/dbus/api/dbus-mempool_8c_source.html
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<title>D-Bus: dbus-mempool.c Source File</title>

<link href="tabs.css" rel="stylesheet" type="text/css"/>
<link href="doxygen.css" rel="stylesheet" type="text/css" />



</head>
<body>
<div id="top"><!-- do not remove this div! -->


<div id="titlearea">
<table cellspacing="0" cellpadding="0">
 <tbody>
 <tr style="height: 56px;">
  
  
  <td style="padding-left: 0.5em;">
   <div id="projectname">D-Bus
   &#160;<span id="projectnumber">1.8.20</span>
   </div>
   
  </td>
  
  
  
 </tr>
 </tbody>
</table>
</div>

<!-- Generated by Doxygen 1.7.6.1 -->
  <div id="navrow1" class="tabs">
    <ul class="tablist">
      <li><a href="index.html"><span>Main&#160;Page</span></a></li>
      <li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
      <li><a href="modules.html"><span>Modules</span></a></li>
      <li><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
      <li class="current"><a href="files.html"><span>Files</span></a></li>
    </ul>
  </div>
  <div id="navrow2" class="tabs2">
    <ul class="tablist">
      <li><a href="files.html"><span>File&#160;List</span></a></li>
    </ul>
  </div>
</div>
<div class="header">
  <div class="headertitle">
<div class="title">dbus-mempool.c</div>  </div>
</div><!--header-->
<div class="contents">
<div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/* -*- mode: C; c-file-style: &quot;gnu&quot;; indent-tabs-mode: nil; -*- */</span>
<a name="l00002"></a>00002 <span class="comment">/* dbus-mempool.h Memory pools</span>
<a name="l00003"></a>00003 <span class="comment"> * </span>
<a name="l00004"></a>00004 <span class="comment"> * Copyright (C) 2002, 2003  Red Hat, Inc.</span>
<a name="l00005"></a>00005 <span class="comment"> *</span>
<a name="l00006"></a>00006 <span class="comment"> * Licensed under the Academic Free License version 2.1</span>
<a name="l00007"></a>00007 <span class="comment"> * </span>
<a name="l00008"></a>00008 <span class="comment"> * This program is free software; you can redistribute it and/or modify</span>
<a name="l00009"></a>00009 <span class="comment"> * it under the terms of the GNU General Public License as published by</span>
<a name="l00010"></a>00010 <span class="comment"> * the Free Software Foundation; either version 2 of the License, or</span>
<a name="l00011"></a>00011 <span class="comment"> * (at your option) any later version.</span>
<a name="l00012"></a>00012 <span class="comment"> *</span>
<a name="l00013"></a>00013 <span class="comment"> * This program is distributed in the hope that it will be useful,</span>
<a name="l00014"></a>00014 <span class="comment"> * but WITHOUT ANY WARRANTY; without even the implied warranty of</span>
<a name="l00015"></a>00015 <span class="comment"> * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the</span>
<a name="l00016"></a>00016 <span class="comment"> * GNU General Public License for more details.</span>
<a name="l00017"></a>00017 <span class="comment"> * </span>
<a name="l00018"></a>00018 <span class="comment"> * You should have received a copy of the GNU General Public License</span>
<a name="l00019"></a>00019 <span class="comment"> * along with this program; if not, write to the Free Software</span>
<a name="l00020"></a>00020 <span class="comment"> * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA</span>
<a name="l00021"></a>00021 <span class="comment"> *</span>
<a name="l00022"></a>00022 <span class="comment"> */</span>
<a name="l00023"></a>00023 
<a name="l00024"></a>00024 <span class="preprocessor">#include &lt;config.h&gt;</span>
<a name="l00025"></a>00025 <span class="preprocessor">#include &quot;dbus-mempool.h&quot;</span>
<a name="l00026"></a>00026 <span class="preprocessor">#include &quot;dbus-internals.h&quot;</span>
<a name="l00027"></a>00027 <span class="preprocessor">#include &quot;dbus-valgrind-internal.h&quot;</span>
<a name="l00028"></a>00028 
<a name="l00054"></a><a class="code" href="group__DBusMemPoolInternals.html#ga4210a89e140e1cccaba27cfabd254eb1">00054</a> <span class="keyword">typedef</span> <span class="keyword">struct </span><a class="code" href="structDBusFreedElement.html" title="struct representing an element on the free list.">DBusFreedElement</a> <a class="code" href="structDBusFreedElement.html" title="struct representing an element on the free list.">DBusFreedElement</a>;
<a name="l00055"></a>00055 
<a name="l00061"></a><a class="code" href="structDBusFreedElement.html">00061</a> <span class="keyword">struct </span><a class="code" href="structDBusFreedElement.html" title="struct representing an element on the free list.">DBusFreedElement</a>
<a name="l00062"></a>00062 {
<a name="l00063"></a><a class="code" href="structDBusFreedElement.html#ac4819bebce960943155f9fbd4ab6e6c5">00063</a>   <a class="code" href="structDBusFreedElement.html" title="struct representing an element on the free list.">DBusFreedElement</a> *<a class="code" href="structDBusFreedElement.html#ac4819bebce960943155f9fbd4ab6e6c5" title="next element of the free list">next</a>; 
<a name="l00064"></a>00064 };
<a name="l00065"></a>00065 
<a name="l00070"></a><a class="code" href="group__DBusMemPoolInternals.html#ga412163ea9cb4effae42afc1147d8b9b8">00070</a> <span class="preprocessor">#define ELEMENT_PADDING 4</span>
<a name="l00071"></a>00071 <span class="preprocessor"></span>
<a name="l00076"></a><a class="code" href="group__DBusMemPoolInternals.html#gadc586003d38772dd8336c4e103844a12">00076</a> <span class="keyword">typedef</span> <span class="keyword">struct </span><a class="code" href="structDBusMemBlock.html" title="DBusMemBlock object represents a single malloc()-returned block that gets chunked up into objects in ...">DBusMemBlock</a> <a class="code" href="structDBusMemBlock.html" title="DBusMemBlock object represents a single malloc()-returned block that gets chunked up into objects in ...">DBusMemBlock</a>;
<a name="l00077"></a>00077 
<a name="l00082"></a><a class="code" href="structDBusMemBlock.html">00082</a> <span class="keyword">struct </span><a class="code" href="structDBusMemBlock.html" title="DBusMemBlock object represents a single malloc()-returned block that gets chunked up into objects in ...">DBusMemBlock</a>
<a name="l00083"></a>00083 {
<a name="l00084"></a><a class="code" href="structDBusMemBlock.html#a88abbae4b7e92bfab8392c2aad2dae9b">00084</a>   <a class="code" href="structDBusMemBlock.html" title="DBusMemBlock object represents a single malloc()-returned block that gets chunked up into objects in ...">DBusMemBlock</a> *<a class="code" href="structDBusMemBlock.html#a88abbae4b7e92bfab8392c2aad2dae9b" title="next block in the list, which is already used up; only saved so we can free all the blocks when we fr...">next</a>;  
<a name="l00089"></a>00089   <span class="comment">/* this is a long so that &quot;elements&quot; is aligned */</span>
<a name="l00090"></a><a class="code" href="structDBusMemBlock.html#ad23a73654095952ea4e2c222c41e5441">00090</a>   <span class="keywordtype">long</span> <a class="code" href="structDBusMemBlock.html#ad23a73654095952ea4e2c222c41e5441" title="bytes of this block already allocated as elements.">used_so_far</a>;     
<a name="l00092"></a><a class="code" href="structDBusMemBlock.html#af685833ddb17150a20cbe538f23f3113">00092</a>   <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> <a class="code" href="structDBusMemBlock.html#af685833ddb17150a20cbe538f23f3113" title="the block data, actually allocated to required size">elements</a>[<a class="code" href="group__DBusMemPoolInternals.html#ga412163ea9cb4effae42afc1147d8b9b8" title="The dummy size of the variable-length &quot;elements&quot; field in DBusMemBlock.">ELEMENT_PADDING</a>]; 
<a name="l00093"></a>00093 };
<a name="l00094"></a>00094 
<a name="l00098"></a><a class="code" href="structDBusMemPool.html">00098</a> <span class="keyword">struct </span><a class="code" href="structDBusMemPool.html" title="Internals fields of DBusMemPool.">DBusMemPool</a>
<a name="l00099"></a>00099 {
<a name="l00100"></a><a class="code" href="structDBusMemPool.html#a690c2330fce2db5cfdbe6b810d70c92f">00100</a>   <span class="keywordtype">int</span> <a class="code" href="structDBusMemPool.html#a690c2330fce2db5cfdbe6b810d70c92f" title="size of a single object in the pool">element_size</a>;                
<a name="l00101"></a><a class="code" href="structDBusMemPool.html#a45cdcee97621d5a2bd85edd90d87d8bf">00101</a>   <span class="keywordtype">int</span> <a class="code" href="structDBusMemPool.html#a45cdcee97621d5a2bd85edd90d87d8bf" title="size of most recently allocated block">block_size</a>;                  
<a name="l00102"></a><a class="code" href="structDBusMemPool.html#a2ebffd5d3e0eb209b1d0fa5779609818">00102</a>   <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="structDBusMemPool.html#a2ebffd5d3e0eb209b1d0fa5779609818" title="whether to zero-init allocated elements">zero_elements</a> : 1;  
<a name="l00104"></a><a class="code" href="structDBusMemPool.html#af02ff4ac188a7a04a02ab140e568886b">00104</a>   <a class="code" href="structDBusFreedElement.html" title="struct representing an element on the free list.">DBusFreedElement</a> *<a class="code" href="structDBusMemPool.html#af02ff4ac188a7a04a02ab140e568886b" title="a free list of elements to recycle">free_elements</a>; 
<a name="l00105"></a><a class="code" href="structDBusMemPool.html#a4682e065e26ee0dc4d2a17023cb41b8b">00105</a>   <a class="code" href="structDBusMemBlock.html" title="DBusMemBlock object represents a single malloc()-returned block that gets chunked up into objects in ...">DBusMemBlock</a> *<a class="code" href="structDBusMemPool.html#a4682e065e26ee0dc4d2a17023cb41b8b" title="blocks of memory from malloc()">blocks</a>;            
<a name="l00106"></a><a class="code" href="structDBusMemPool.html#a23cd8af3ecb8cd88074b1934b1d7597c">00106</a>   <span class="keywordtype">int</span> <a class="code" href="structDBusMemPool.html#a23cd8af3ecb8cd88074b1934b1d7597c" title="Count of outstanding allocated elements.">allocated_elements</a>;          
<a name="l00107"></a>00107 };
<a name="l00108"></a>00108 
<a name="l00137"></a>00137 <a class="code" href="structDBusMemPool.html" title="Internals fields of DBusMemPool.">DBusMemPool</a>*
<a name="l00138"></a><a class="code" href="group__DBusMemPool.html#gaf1bae02bc5fcb879f77ff2c13ca03ac8">00138</a> <a class="code" href="group__DBusMemPool.html#gaf1bae02bc5fcb879f77ff2c13ca03ac8" title="Creates a new memory pool, or returns NULL on failure.">_dbus_mem_pool_new</a> (<span class="keywordtype">int</span> element_size,
<a name="l00139"></a>00139                     <a class="code" href="group__DBusTypes.html#ga39c9cb0f3a2a8ad6f55cc4855d035349" title="A boolean, valid values are TRUE and FALSE.">dbus_bool_t</a> zero_elements)
<a name="l00140"></a>00140 {
<a name="l00141"></a>00141   <a class="code" href="structDBusMemPool.html" title="Internals fields of DBusMemPool.">DBusMemPool</a> *pool;
<a name="l00142"></a>00142 
<a name="l00143"></a>00143   pool = <a class="code" href="group__DBusMemory.html#gaba9d823abda7f4cadbaf5177d3b8b793" title="Safe macro for using dbus_malloc0().">dbus_new0</a> (<a class="code" href="structDBusMemPool.html" title="Internals fields of DBusMemPool.">DBusMemPool</a>, 1);
<a name="l00144"></a>00144   <span class="keywordflow">if</span> (pool == <a class="code" href="group__DBusMacros.html#ga070d2ce7b6bb7e5c05602aa8c308d0c4" title="A null pointer, defined appropriately for C or C++.">NULL</a>)
<a name="l00145"></a>00145     <span class="keywordflow">return</span> <a class="code" href="group__DBusMacros.html#ga070d2ce7b6bb7e5c05602aa8c308d0c4" title="A null pointer, defined appropriately for C or C++.">NULL</a>;
<a name="l00146"></a>00146 
<a name="l00147"></a>00147   <span class="comment">/* Make the element size at least 8 bytes. */</span>
<a name="l00148"></a>00148   <span class="keywordflow">if</span> (element_size &lt; 8)
<a name="l00149"></a>00149     element_size = 8;
<a name="l00150"></a>00150   
<a name="l00151"></a>00151   <span class="comment">/* these assertions are equivalent but the first is more clear</span>
<a name="l00152"></a>00152 <span class="comment">   * to programmers that see it fail.</span>
<a name="l00153"></a>00153 <span class="comment">   */</span>
<a name="l00154"></a>00154   _dbus_assert (element_size &gt;= (<span class="keywordtype">int</span>) <span class="keyword">sizeof</span> (<span class="keywordtype">void</span>*));
<a name="l00155"></a>00155   _dbus_assert (element_size &gt;= (<span class="keywordtype">int</span>) <span class="keyword">sizeof</span> (<a class="code" href="structDBusFreedElement.html" title="struct representing an element on the free list.">DBusFreedElement</a>));
<a name="l00156"></a>00156 
<a name="l00157"></a>00157   <span class="comment">/* align the element size to a pointer boundary so we won&#39;t get bus</span>
<a name="l00158"></a>00158 <span class="comment">   * errors under other architectures.  </span>
<a name="l00159"></a>00159 <span class="comment">   */</span>
<a name="l00160"></a>00160   pool-&gt;<a class="code" href="structDBusMemPool.html#a690c2330fce2db5cfdbe6b810d70c92f" title="size of a single object in the pool">element_size</a> = _DBUS_ALIGN_VALUE (element_size, <span class="keyword">sizeof</span> (<span class="keywordtype">void</span> *));
<a name="l00161"></a>00161 
<a name="l00162"></a>00162   pool-&gt;<a class="code" href="structDBusMemPool.html#a2ebffd5d3e0eb209b1d0fa5779609818" title="whether to zero-init allocated elements">zero_elements</a> = zero_elements != <a class="code" href="group__DBusMacros.html#gaa93f0eb578d23995850d61f7d61c55c1" title="Expands to &quot;0&quot;.">FALSE</a>;
<a name="l00163"></a>00163 
<a name="l00164"></a>00164   pool-&gt;<a class="code" href="structDBusMemPool.html#a23cd8af3ecb8cd88074b1934b1d7597c" title="Count of outstanding allocated elements.">allocated_elements</a> = 0;
<a name="l00165"></a>00165   
<a name="l00166"></a>00166   <span class="comment">/* pick a size for the first block; it increases</span>
<a name="l00167"></a>00167 <span class="comment">   * for each block we need to allocate. This is</span>
<a name="l00168"></a>00168 <span class="comment">   * actually half the initial block size</span>
<a name="l00169"></a>00169 <span class="comment">   * since _dbus_mem_pool_alloc() unconditionally</span>
<a name="l00170"></a>00170 <span class="comment">   * doubles it prior to creating a new block.  */</span>
<a name="l00171"></a>00171   pool-&gt;<a class="code" href="structDBusMemPool.html#a45cdcee97621d5a2bd85edd90d87d8bf" title="size of most recently allocated block">block_size</a> = pool-&gt;<a class="code" href="structDBusMemPool.html#a690c2330fce2db5cfdbe6b810d70c92f" title="size of a single object in the pool">element_size</a> * 8;
<a name="l00172"></a>00172 
<a name="l00173"></a>00173   _dbus_assert ((pool-&gt;<a class="code" href="structDBusMemPool.html#a45cdcee97621d5a2bd85edd90d87d8bf" title="size of most recently allocated block">block_size</a> %
<a name="l00174"></a>00174                  pool-&gt;<a class="code" href="structDBusMemPool.html#a690c2330fce2db5cfdbe6b810d70c92f" title="size of a single object in the pool">element_size</a>) == 0);
<a name="l00175"></a>00175 
<a name="l00176"></a>00176   VALGRIND_CREATE_MEMPOOL (pool, 0, zero_elements);
<a name="l00177"></a>00177 
<a name="l00178"></a>00178   <span class="keywordflow">return</span> pool;
<a name="l00179"></a>00179 }
<a name="l00180"></a>00180 
<a name="l00186"></a>00186 <span class="keywordtype">void</span>
<a name="l00187"></a><a class="code" href="group__DBusMemPool.html#ga58e4f3def46410d5bb138a2b8f366b1a">00187</a> <a class="code" href="group__DBusMemPool.html#ga58e4f3def46410d5bb138a2b8f366b1a" title="Frees a memory pool (and all elements allocated from it).">_dbus_mem_pool_free</a> (<a class="code" href="structDBusMemPool.html" title="Internals fields of DBusMemPool.">DBusMemPool</a> *pool)
<a name="l00188"></a>00188 {
<a name="l00189"></a>00189   <a class="code" href="structDBusMemBlock.html" title="DBusMemBlock object represents a single malloc()-returned block that gets chunked up into objects in ...">DBusMemBlock</a> *block;
<a name="l00190"></a>00190 
<a name="l00191"></a>00191   VALGRIND_DESTROY_MEMPOOL (pool);
<a name="l00192"></a>00192 
<a name="l00193"></a>00193   block = pool-&gt;<a class="code" href="structDBusMemPool.html#a4682e065e26ee0dc4d2a17023cb41b8b" title="blocks of memory from malloc()">blocks</a>;
<a name="l00194"></a>00194   <span class="keywordflow">while</span> (block != <a class="code" href="group__DBusMacros.html#ga070d2ce7b6bb7e5c05602aa8c308d0c4" title="A null pointer, defined appropriately for C or C++.">NULL</a>)
<a name="l00195"></a>00195     {
<a name="l00196"></a>00196       <a class="code" href="structDBusMemBlock.html" title="DBusMemBlock object represents a single malloc()-returned block that gets chunked up into objects in ...">DBusMemBlock</a> *next = block-&gt;<a class="code" href="structDBusMemBlock.html#a88abbae4b7e92bfab8392c2aad2dae9b" title="next block in the list, which is already used up; only saved so we can free all the blocks when we fr...">next</a>;
<a name="l00197"></a>00197 
<a name="l00198"></a>00198       <a class="code" href="group__DBusMemory.html#ga34e666b19b015035a9a31e53da84b39a" title="Frees a block of memory previously allocated by dbus_malloc() or dbus_malloc0().">dbus_free</a> (block);
<a name="l00199"></a>00199 
<a name="l00200"></a>00200       block = next;
<a name="l00201"></a>00201     }
<a name="l00202"></a>00202 
<a name="l00203"></a>00203   <a class="code" href="group__DBusMemory.html#ga34e666b19b015035a9a31e53da84b39a" title="Frees a block of memory previously allocated by dbus_malloc() or dbus_malloc0().">dbus_free</a> (pool);
<a name="l00204"></a>00204 }
<a name="l00205"></a>00205 
<a name="l00213"></a>00213 <span class="keywordtype">void</span>*
<a name="l00214"></a><a class="code" href="group__DBusMemPool.html#ga0946d54f767b4f55238f5a39c8543df1">00214</a> <a class="code" href="group__DBusMemPool.html#ga0946d54f767b4f55238f5a39c8543df1" title="Allocates an object from the memory pool.">_dbus_mem_pool_alloc</a> (<a class="code" href="structDBusMemPool.html" title="Internals fields of DBusMemPool.">DBusMemPool</a> *pool)
<a name="l00215"></a>00215 {
<a name="l00216"></a>00216 <span class="preprocessor">#ifdef DBUS_ENABLE_EMBEDDED_TESTS</span>
<a name="l00217"></a>00217 <span class="preprocessor"></span>  <span class="keywordflow">if</span> (_dbus_disable_mem_pools ())
<a name="l00218"></a>00218     {
<a name="l00219"></a>00219       <a class="code" href="structDBusMemBlock.html" title="DBusMemBlock object represents a single malloc()-returned block that gets chunked up into objects in ...">DBusMemBlock</a> *block;
<a name="l00220"></a>00220       <span class="keywordtype">int</span> alloc_size;
<a name="l00221"></a>00221       
<a name="l00222"></a>00222       <span class="comment">/* This is obviously really silly, but it&#39;s</span>
<a name="l00223"></a>00223 <span class="comment">       * debug-mode-only code that is compiled out</span>
<a name="l00224"></a>00224 <span class="comment">       * when tests are disabled (_dbus_disable_mem_pools()</span>
<a name="l00225"></a>00225 <span class="comment">       * is a constant expression FALSE so this block</span>
<a name="l00226"></a>00226 <span class="comment">       * should vanish)</span>
<a name="l00227"></a>00227 <span class="comment">       */</span>
<a name="l00228"></a>00228       
<a name="l00229"></a>00229       alloc_size = <span class="keyword">sizeof</span> (<a class="code" href="group__DBusMemPoolInternals.html#gadc586003d38772dd8336c4e103844a12" title="Typedef for DBusMemBlock so the struct can recursively point to itself.">DBusMemBlock</a>) - <a class="code" href="group__DBusMemPoolInternals.html#ga412163ea9cb4effae42afc1147d8b9b8" title="The dummy size of the variable-length &quot;elements&quot; field in DBusMemBlock.">ELEMENT_PADDING</a> +
<a name="l00230"></a>00230         pool-&gt;<a class="code" href="structDBusMemPool.html#a690c2330fce2db5cfdbe6b810d70c92f" title="size of a single object in the pool">element_size</a>;
<a name="l00231"></a>00231       
<a name="l00232"></a>00232       if (pool-&gt;<a class="code" href="structDBusMemPool.html#a2ebffd5d3e0eb209b1d0fa5779609818" title="whether to zero-init allocated elements">zero_elements</a>)
<a name="l00233"></a>00233         block = <a class="code" href="group__DBusMemory.html#gaa02722b030a091f6c14c4cb11a593623" title="Allocates the given number of bytes, as with standard malloc(), but all bytes are initialized to zero...">dbus_malloc0</a> (alloc_size);
<a name="l00234"></a>00234       <span class="keywordflow">else</span>
<a name="l00235"></a>00235         block = <a class="code" href="group__DBusMemory.html#gaf6e588659067a854c3cca7ebe8ae5084" title="Allocates the given number of bytes, as with standard malloc().">dbus_malloc</a> (alloc_size);
<a name="l00236"></a>00236 
<a name="l00237"></a>00237       <span class="keywordflow">if</span> (block != <a class="code" href="group__DBusMacros.html#ga070d2ce7b6bb7e5c05602aa8c308d0c4" title="A null pointer, defined appropriately for C or C++.">NULL</a>)
<a name="l00238"></a>00238         {
<a name="l00239"></a>00239           block-&gt;<a class="code" href="structDBusMemBlock.html#a88abbae4b7e92bfab8392c2aad2dae9b" title="next block in the list, which is already used up; only saved so we can free all the blocks when we fr...">next</a> = pool-&gt;<a class="code" href="structDBusMemPool.html#a4682e065e26ee0dc4d2a17023cb41b8b" title="blocks of memory from malloc()">blocks</a>;
<a name="l00240"></a>00240           pool-&gt;<a class="code" href="structDBusMemPool.html#a4682e065e26ee0dc4d2a17023cb41b8b" title="blocks of memory from malloc()">blocks</a> = block;
<a name="l00241"></a>00241           pool-&gt;<a class="code" href="structDBusMemPool.html#a23cd8af3ecb8cd88074b1934b1d7597c" title="Count of outstanding allocated elements.">allocated_elements</a> += 1;
<a name="l00242"></a>00242 
<a name="l00243"></a>00243           VALGRIND_MEMPOOL_ALLOC (pool, (<span class="keywordtype">void</span> *) &amp;block-&gt;<a class="code" href="structDBusMemBlock.html#af685833ddb17150a20cbe538f23f3113" title="the block data, actually allocated to required size">elements</a>[0],
<a name="l00244"></a>00244               pool-&gt;<a class="code" href="structDBusMemPool.html#a690c2330fce2db5cfdbe6b810d70c92f" title="size of a single object in the pool">element_size</a>);
<a name="l00245"></a>00245           <span class="keywordflow">return</span> (<span class="keywordtype">void</span>*) &amp;block-&gt;<a class="code" href="structDBusMemBlock.html#af685833ddb17150a20cbe538f23f3113" title="the block data, actually allocated to required size">elements</a>[0];
<a name="l00246"></a>00246         }
<a name="l00247"></a>00247       <span class="keywordflow">else</span>
<a name="l00248"></a>00248         <span class="keywordflow">return</span> <a class="code" href="group__DBusMacros.html#ga070d2ce7b6bb7e5c05602aa8c308d0c4" title="A null pointer, defined appropriately for C or C++.">NULL</a>;
<a name="l00249"></a>00249     }
<a name="l00250"></a>00250   <span class="keywordflow">else</span>
<a name="l00251"></a>00251 <span class="preprocessor">#endif</span>
<a name="l00252"></a>00252 <span class="preprocessor"></span>    {
<a name="l00253"></a>00253       <span class="keywordflow">if</span> (_dbus_decrement_fail_alloc_counter ())
<a name="l00254"></a>00254         {
<a name="l00255"></a>00255           _dbus_verbose (<span class="stringliteral">&quot; FAILING mempool alloc\n&quot;</span>);
<a name="l00256"></a>00256           <span class="keywordflow">return</span> <a class="code" href="group__DBusMacros.html#ga070d2ce7b6bb7e5c05602aa8c308d0c4" title="A null pointer, defined appropriately for C or C++.">NULL</a>;
<a name="l00257"></a>00257         }
<a name="l00258"></a>00258       <span class="keywordflow">else</span> <span class="keywordflow">if</span> (pool-&gt;<a class="code" href="structDBusMemPool.html#af02ff4ac188a7a04a02ab140e568886b" title="a free list of elements to recycle">free_elements</a>)
<a name="l00259"></a>00259         {
<a name="l00260"></a>00260           <a class="code" href="structDBusFreedElement.html" title="struct representing an element on the free list.">DBusFreedElement</a> *element = pool-&gt;<a class="code" href="structDBusMemPool.html#af02ff4ac188a7a04a02ab140e568886b" title="a free list of elements to recycle">free_elements</a>;
<a name="l00261"></a>00261 
<a name="l00262"></a>00262           pool-&gt;<a class="code" href="structDBusMemPool.html#af02ff4ac188a7a04a02ab140e568886b" title="a free list of elements to recycle">free_elements</a> = pool-&gt;<a class="code" href="structDBusMemPool.html#af02ff4ac188a7a04a02ab140e568886b" title="a free list of elements to recycle">free_elements</a>-&gt;<a class="code" href="structDBusFreedElement.html#ac4819bebce960943155f9fbd4ab6e6c5" title="next element of the free list">next</a>;
<a name="l00263"></a>00263 
<a name="l00264"></a>00264           VALGRIND_MEMPOOL_ALLOC (pool, element, pool-&gt;<a class="code" href="structDBusMemPool.html#a690c2330fce2db5cfdbe6b810d70c92f" title="size of a single object in the pool">element_size</a>);
<a name="l00265"></a>00265 
<a name="l00266"></a>00266           <span class="keywordflow">if</span> (pool-&gt;<a class="code" href="structDBusMemPool.html#a2ebffd5d3e0eb209b1d0fa5779609818" title="whether to zero-init allocated elements">zero_elements</a>)
<a name="l00267"></a>00267             memset (element, <span class="charliteral">&#39;\0&#39;</span>, pool-&gt;<a class="code" href="structDBusMemPool.html#a690c2330fce2db5cfdbe6b810d70c92f" title="size of a single object in the pool">element_size</a>);
<a name="l00268"></a>00268 
<a name="l00269"></a>00269           pool-&gt;<a class="code" href="structDBusMemPool.html#a23cd8af3ecb8cd88074b1934b1d7597c" title="Count of outstanding allocated elements.">allocated_elements</a> += 1;
<a name="l00270"></a>00270 
<a name="l00271"></a>00271           <span class="keywordflow">return</span> element;
<a name="l00272"></a>00272         }
<a name="l00273"></a>00273       <span class="keywordflow">else</span>
<a name="l00274"></a>00274         {
<a name="l00275"></a>00275           <span class="keywordtype">void</span> *element;
<a name="l00276"></a>00276       
<a name="l00277"></a>00277           <span class="keywordflow">if</span> (pool-&gt;<a class="code" href="structDBusMemPool.html#a4682e065e26ee0dc4d2a17023cb41b8b" title="blocks of memory from malloc()">blocks</a> == <a class="code" href="group__DBusMacros.html#ga070d2ce7b6bb7e5c05602aa8c308d0c4" title="A null pointer, defined appropriately for C or C++.">NULL</a> ||
<a name="l00278"></a>00278               pool-&gt;<a class="code" href="structDBusMemPool.html#a4682e065e26ee0dc4d2a17023cb41b8b" title="blocks of memory from malloc()">blocks</a>-&gt;<a class="code" href="structDBusMemBlock.html#ad23a73654095952ea4e2c222c41e5441" title="bytes of this block already allocated as elements.">used_so_far</a> == pool-&gt;<a class="code" href="structDBusMemPool.html#a45cdcee97621d5a2bd85edd90d87d8bf" title="size of most recently allocated block">block_size</a>)
<a name="l00279"></a>00279             {
<a name="l00280"></a>00280               <span class="comment">/* Need a new block */</span>
<a name="l00281"></a>00281               <a class="code" href="structDBusMemBlock.html" title="DBusMemBlock object represents a single malloc()-returned block that gets chunked up into objects in ...">DBusMemBlock</a> *block;
<a name="l00282"></a>00282               <span class="keywordtype">int</span> alloc_size;
<a name="l00283"></a>00283 <span class="preprocessor">#ifdef DBUS_ENABLE_EMBEDDED_TESTS</span>
<a name="l00284"></a>00284 <span class="preprocessor"></span>              <span class="keywordtype">int</span> saved_counter;
<a name="l00285"></a>00285 <span class="preprocessor">#endif</span>
<a name="l00286"></a>00286 <span class="preprocessor"></span>          
<a name="l00287"></a>00287               <span class="keywordflow">if</span> (pool-&gt;<a class="code" href="structDBusMemPool.html#a45cdcee97621d5a2bd85edd90d87d8bf" title="size of most recently allocated block">block_size</a> &lt;= _DBUS_INT_MAX / 4) <span class="comment">/* avoid overflow */</span>
<a name="l00288"></a>00288                 {
<a name="l00289"></a>00289                   <span class="comment">/* use a larger block size for our next block */</span>
<a name="l00290"></a>00290                   pool-&gt;<a class="code" href="structDBusMemPool.html#a45cdcee97621d5a2bd85edd90d87d8bf" title="size of most recently allocated block">block_size</a> *= 2;
<a name="l00291"></a>00291                   _dbus_assert ((pool-&gt;<a class="code" href="structDBusMemPool.html#a45cdcee97621d5a2bd85edd90d87d8bf" title="size of most recently allocated block">block_size</a> %
<a name="l00292"></a>00292                                  pool-&gt;<a class="code" href="structDBusMemPool.html#a690c2330fce2db5cfdbe6b810d70c92f" title="size of a single object in the pool">element_size</a>) == 0);
<a name="l00293"></a>00293                 }
<a name="l00294"></a>00294 
<a name="l00295"></a>00295               alloc_size = <span class="keyword">sizeof</span> (<a class="code" href="group__DBusMemPoolInternals.html#gadc586003d38772dd8336c4e103844a12" title="Typedef for DBusMemBlock so the struct can recursively point to itself.">DBusMemBlock</a>) - <a class="code" href="group__DBusMemPoolInternals.html#ga412163ea9cb4effae42afc1147d8b9b8" title="The dummy size of the variable-length &quot;elements&quot; field in DBusMemBlock.">ELEMENT_PADDING</a> + pool-&gt;<a class="code" href="structDBusMemPool.html#a45cdcee97621d5a2bd85edd90d87d8bf" title="size of most recently allocated block">block_size</a>;
<a name="l00296"></a>00296 
<a name="l00297"></a>00297 #ifdef DBUS_ENABLE_EMBEDDED_TESTS
<a name="l00298"></a>00298               <span class="comment">/* We save/restore the counter, so that memory pools won&#39;t</span>
<a name="l00299"></a>00299 <span class="comment">               * cause a given function to have different number of</span>
<a name="l00300"></a>00300 <span class="comment">               * allocations on different invocations. i.e.  when testing</span>
<a name="l00301"></a>00301 <span class="comment">               * we want consistent alloc patterns. So we skip our</span>
<a name="l00302"></a>00302 <span class="comment">               * malloc here for purposes of failed alloc simulation.</span>
<a name="l00303"></a>00303 <span class="comment">               */</span>
<a name="l00304"></a>00304               saved_counter = _dbus_get_fail_alloc_counter ();
<a name="l00305"></a>00305               _dbus_set_fail_alloc_counter (_DBUS_INT_MAX);
<a name="l00306"></a>00306 <span class="preprocessor">#endif</span>
<a name="l00307"></a>00307 <span class="preprocessor"></span>          
<a name="l00308"></a>00308               <span class="keywordflow">if</span> (pool-&gt;<a class="code" href="structDBusMemPool.html#a2ebffd5d3e0eb209b1d0fa5779609818" title="whether to zero-init allocated elements">zero_elements</a>)
<a name="l00309"></a>00309                 block = <a class="code" href="group__DBusMemory.html#gaa02722b030a091f6c14c4cb11a593623" title="Allocates the given number of bytes, as with standard malloc(), but all bytes are initialized to zero...">dbus_malloc0</a> (alloc_size);
<a name="l00310"></a>00310               <span class="keywordflow">else</span>
<a name="l00311"></a>00311                 block = <a class="code" href="group__DBusMemory.html#gaf6e588659067a854c3cca7ebe8ae5084" title="Allocates the given number of bytes, as with standard malloc().">dbus_malloc</a> (alloc_size);
<a name="l00312"></a>00312 
<a name="l00313"></a>00313 <span class="preprocessor">#ifdef DBUS_ENABLE_EMBEDDED_TESTS</span>
<a name="l00314"></a>00314 <span class="preprocessor"></span>              _dbus_set_fail_alloc_counter (saved_counter);
<a name="l00315"></a>00315               _dbus_assert (saved_counter == _dbus_get_fail_alloc_counter ());
<a name="l00316"></a>00316 <span class="preprocessor">#endif</span>
<a name="l00317"></a>00317 <span class="preprocessor"></span>          
<a name="l00318"></a>00318               <span class="keywordflow">if</span> (block == <a class="code" href="group__DBusMacros.html#ga070d2ce7b6bb7e5c05602aa8c308d0c4" title="A null pointer, defined appropriately for C or C++.">NULL</a>)
<a name="l00319"></a>00319                 <span class="keywordflow">return</span> <a class="code" href="group__DBusMacros.html#ga070d2ce7b6bb7e5c05602aa8c308d0c4" title="A null pointer, defined appropriately for C or C++.">NULL</a>;
<a name="l00320"></a>00320 
<a name="l00321"></a>00321               block-&gt;<a class="code" href="structDBusMemBlock.html#ad23a73654095952ea4e2c222c41e5441" title="bytes of this block already allocated as elements.">used_so_far</a> = 0;
<a name="l00322"></a>00322               block-&gt;<a class="code" href="structDBusMemBlock.html#a88abbae4b7e92bfab8392c2aad2dae9b" title="next block in the list, which is already used up; only saved so we can free all the blocks when we fr...">next</a> = pool-&gt;<a class="code" href="structDBusMemPool.html#a4682e065e26ee0dc4d2a17023cb41b8b" title="blocks of memory from malloc()">blocks</a>;
<a name="l00323"></a>00323               pool-&gt;<a class="code" href="structDBusMemPool.html#a4682e065e26ee0dc4d2a17023cb41b8b" title="blocks of memory from malloc()">blocks</a> = block;          
<a name="l00324"></a>00324             }
<a name="l00325"></a>00325       
<a name="l00326"></a>00326           element = &amp;pool-&gt;<a class="code" href="structDBusMemPool.html#a4682e065e26ee0dc4d2a17023cb41b8b" title="blocks of memory from malloc()">blocks</a>-&gt;<a class="code" href="structDBusMemBlock.html#af685833ddb17150a20cbe538f23f3113" title="the block data, actually allocated to required size">elements</a>[pool-&gt;<a class="code" href="structDBusMemPool.html#a4682e065e26ee0dc4d2a17023cb41b8b" title="blocks of memory from malloc()">blocks</a>-&gt;<a class="code" href="structDBusMemBlock.html#ad23a73654095952ea4e2c222c41e5441" title="bytes of this block already allocated as elements.">used_so_far</a>];
<a name="l00327"></a>00327           
<a name="l00328"></a>00328           pool-&gt;<a class="code" href="structDBusMemPool.html#a4682e065e26ee0dc4d2a17023cb41b8b" title="blocks of memory from malloc()">blocks</a>-&gt;<a class="code" href="structDBusMemBlock.html#ad23a73654095952ea4e2c222c41e5441" title="bytes of this block already allocated as elements.">used_so_far</a> += pool-&gt;<a class="code" href="structDBusMemPool.html#a690c2330fce2db5cfdbe6b810d70c92f" title="size of a single object in the pool">element_size</a>;
<a name="l00329"></a>00329 
<a name="l00330"></a>00330           pool-&gt;<a class="code" href="structDBusMemPool.html#a23cd8af3ecb8cd88074b1934b1d7597c" title="Count of outstanding allocated elements.">allocated_elements</a> += 1;
<a name="l00331"></a>00331 
<a name="l00332"></a>00332           VALGRIND_MEMPOOL_ALLOC (pool, element, pool-&gt;<a class="code" href="structDBusMemPool.html#a690c2330fce2db5cfdbe6b810d70c92f" title="size of a single object in the pool">element_size</a>);
<a name="l00333"></a>00333           <span class="keywordflow">return</span> element;
<a name="l00334"></a>00334         }
<a name="l00335"></a>00335     }
<a name="l00336"></a>00336 }
<a name="l00337"></a>00337 
<a name="l00346"></a>00346 <a class="code" href="group__DBusTypes.html#ga39c9cb0f3a2a8ad6f55cc4855d035349" title="A boolean, valid values are TRUE and FALSE.">dbus_bool_t</a>
<a name="l00347"></a><a class="code" href="group__DBusMemPool.html#ga4e2feaefee7384ed940059e6c7b0a9d5">00347</a> <a class="code" href="group__DBusMemPool.html#ga4e2feaefee7384ed940059e6c7b0a9d5" title="Deallocates an object previously created with _dbus_mem_pool_alloc().">_dbus_mem_pool_dealloc</a> (<a class="code" href="structDBusMemPool.html" title="Internals fields of DBusMemPool.">DBusMemPool</a> *pool,
<a name="l00348"></a>00348                         <span class="keywordtype">void</span>        *element)
<a name="l00349"></a>00349 {
<a name="l00350"></a>00350   VALGRIND_MEMPOOL_FREE (pool, element);
<a name="l00351"></a>00351 
<a name="l00352"></a>00352 <span class="preprocessor">#ifdef DBUS_ENABLE_EMBEDDED_TESTS</span>
<a name="l00353"></a>00353 <span class="preprocessor"></span>  <span class="keywordflow">if</span> (_dbus_disable_mem_pools ())
<a name="l00354"></a>00354     {
<a name="l00355"></a>00355       <a class="code" href="structDBusMemBlock.html" title="DBusMemBlock object represents a single malloc()-returned block that gets chunked up into objects in ...">DBusMemBlock</a> *block;
<a name="l00356"></a>00356       <a class="code" href="structDBusMemBlock.html" title="DBusMemBlock object represents a single malloc()-returned block that gets chunked up into objects in ...">DBusMemBlock</a> *prev;
<a name="l00357"></a>00357 
<a name="l00358"></a>00358       <span class="comment">/* mmm, fast. ;-) debug-only code, so doesn&#39;t matter. */</span>
<a name="l00359"></a>00359       
<a name="l00360"></a>00360       prev = <a class="code" href="group__DBusMacros.html#ga070d2ce7b6bb7e5c05602aa8c308d0c4" title="A null pointer, defined appropriately for C or C++.">NULL</a>;
<a name="l00361"></a>00361       block = pool-&gt;<a class="code" href="structDBusMemPool.html#a4682e065e26ee0dc4d2a17023cb41b8b" title="blocks of memory from malloc()">blocks</a>;
<a name="l00362"></a>00362 
<a name="l00363"></a>00363       <span class="keywordflow">while</span> (block != <a class="code" href="group__DBusMacros.html#ga070d2ce7b6bb7e5c05602aa8c308d0c4" title="A null pointer, defined appropriately for C or C++.">NULL</a>)
<a name="l00364"></a>00364         {
<a name="l00365"></a>00365           <span class="keywordflow">if</span> (block-&gt;<a class="code" href="structDBusMemBlock.html#af685833ddb17150a20cbe538f23f3113" title="the block data, actually allocated to required size">elements</a> == (<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span>*) element)
<a name="l00366"></a>00366             {
<a name="l00367"></a>00367               <span class="keywordflow">if</span> (prev)
<a name="l00368"></a>00368                 prev-&gt;<a class="code" href="structDBusMemBlock.html#a88abbae4b7e92bfab8392c2aad2dae9b" title="next block in the list, which is already used up; only saved so we can free all the blocks when we fr...">next</a> = block-&gt;<a class="code" href="structDBusMemBlock.html#a88abbae4b7e92bfab8392c2aad2dae9b" title="next block in the list, which is already used up; only saved so we can free all the blocks when we fr...">next</a>;
<a name="l00369"></a>00369               <span class="keywordflow">else</span>
<a name="l00370"></a>00370                 pool-&gt;<a class="code" href="structDBusMemPool.html#a4682e065e26ee0dc4d2a17023cb41b8b" title="blocks of memory from malloc()">blocks</a> = block-&gt;<a class="code" href="structDBusMemBlock.html#a88abbae4b7e92bfab8392c2aad2dae9b" title="next block in the list, which is already used up; only saved so we can free all the blocks when we fr...">next</a>;
<a name="l00371"></a>00371               
<a name="l00372"></a>00372               <a class="code" href="group__DBusMemory.html#ga34e666b19b015035a9a31e53da84b39a" title="Frees a block of memory previously allocated by dbus_malloc() or dbus_malloc0().">dbus_free</a> (block);
<a name="l00373"></a>00373 
<a name="l00374"></a>00374               _dbus_assert (pool-&gt;<a class="code" href="structDBusMemPool.html#a23cd8af3ecb8cd88074b1934b1d7597c" title="Count of outstanding allocated elements.">allocated_elements</a> &gt; 0);
<a name="l00375"></a>00375               pool-&gt;<a class="code" href="structDBusMemPool.html#a23cd8af3ecb8cd88074b1934b1d7597c" title="Count of outstanding allocated elements.">allocated_elements</a> -= 1;
<a name="l00376"></a>00376               
<a name="l00377"></a>00377               <span class="keywordflow">if</span> (pool-&gt;<a class="code" href="structDBusMemPool.html#a23cd8af3ecb8cd88074b1934b1d7597c" title="Count of outstanding allocated elements.">allocated_elements</a> == 0)
<a name="l00378"></a>00378                 _dbus_assert (pool-&gt;<a class="code" href="structDBusMemPool.html#a4682e065e26ee0dc4d2a17023cb41b8b" title="blocks of memory from malloc()">blocks</a> == <a class="code" href="group__DBusMacros.html#ga070d2ce7b6bb7e5c05602aa8c308d0c4" title="A null pointer, defined appropriately for C or C++.">NULL</a>);
<a name="l00379"></a>00379               
<a name="l00380"></a>00380               <span class="keywordflow">return</span> pool-&gt;<a class="code" href="structDBusMemPool.html#a4682e065e26ee0dc4d2a17023cb41b8b" title="blocks of memory from malloc()">blocks</a> == <a class="code" href="group__DBusMacros.html#ga070d2ce7b6bb7e5c05602aa8c308d0c4" title="A null pointer, defined appropriately for C or C++.">NULL</a>;
<a name="l00381"></a>00381             }
<a name="l00382"></a>00382           prev = block;
<a name="l00383"></a>00383           block = block-&gt;<a class="code" href="structDBusMemBlock.html#a88abbae4b7e92bfab8392c2aad2dae9b" title="next block in the list, which is already used up; only saved so we can free all the blocks when we fr...">next</a>;
<a name="l00384"></a>00384         }
<a name="l00385"></a>00385       
<a name="l00386"></a>00386       _dbus_assert_not_reached (<span class="stringliteral">&quot;freed nonexistent block&quot;</span>);
<a name="l00387"></a>00387       <span class="keywordflow">return</span> <a class="code" href="group__DBusMacros.html#gaa93f0eb578d23995850d61f7d61c55c1" title="Expands to &quot;0&quot;.">FALSE</a>;
<a name="l00388"></a>00388     }
<a name="l00389"></a>00389   <span class="keywordflow">else</span>
<a name="l00390"></a>00390 <span class="preprocessor">#endif</span>
<a name="l00391"></a>00391 <span class="preprocessor"></span>    {
<a name="l00392"></a>00392       <a class="code" href="structDBusFreedElement.html" title="struct representing an element on the free list.">DBusFreedElement</a> *freed;
<a name="l00393"></a>00393       
<a name="l00394"></a>00394       freed = element;
<a name="l00395"></a>00395       <span class="comment">/* used for internal mempool administration */</span>
<a name="l00396"></a>00396       VALGRIND_MAKE_MEM_UNDEFINED (freed, <span class="keyword">sizeof</span> (*freed));
<a name="l00397"></a>00397 
<a name="l00398"></a>00398       freed-&gt;<a class="code" href="structDBusFreedElement.html#ac4819bebce960943155f9fbd4ab6e6c5" title="next element of the free list">next</a> = pool-&gt;<a class="code" href="structDBusMemPool.html#af02ff4ac188a7a04a02ab140e568886b" title="a free list of elements to recycle">free_elements</a>;
<a name="l00399"></a>00399       pool-&gt;<a class="code" href="structDBusMemPool.html#af02ff4ac188a7a04a02ab140e568886b" title="a free list of elements to recycle">free_elements</a> = freed;
<a name="l00400"></a>00400       
<a name="l00401"></a>00401       _dbus_assert (pool-&gt;<a class="code" href="structDBusMemPool.html#a23cd8af3ecb8cd88074b1934b1d7597c" title="Count of outstanding allocated elements.">allocated_elements</a> &gt; 0);
<a name="l00402"></a>00402       pool-&gt;<a class="code" href="structDBusMemPool.html#a23cd8af3ecb8cd88074b1934b1d7597c" title="Count of outstanding allocated elements.">allocated_elements</a> -= 1;
<a name="l00403"></a>00403       
<a name="l00404"></a>00404       <span class="keywordflow">return</span> pool-&gt;<a class="code" href="structDBusMemPool.html#a23cd8af3ecb8cd88074b1934b1d7597c" title="Count of outstanding allocated elements.">allocated_elements</a> == 0;
<a name="l00405"></a>00405     }
<a name="l00406"></a>00406 }
<a name="l00407"></a>00407 
<a name="l00408"></a>00408 <span class="preprocessor">#ifdef DBUS_ENABLE_STATS</span>
<a name="l00409"></a>00409 <span class="preprocessor"></span><span class="keywordtype">void</span>
<a name="l00410"></a>00410 _dbus_mem_pool_get_stats (<a class="code" href="structDBusMemPool.html" title="Internals fields of DBusMemPool.">DBusMemPool</a>   *pool,
<a name="l00411"></a>00411                           <a class="code" href="group__DBusTypes.html#gaf513803b030613a669cc7ef199f90a8b" title="A 32-bit unsigned integer on all platforms.">dbus_uint32_t</a> *in_use_p,
<a name="l00412"></a>00412                           <a class="code" href="group__DBusTypes.html#gaf513803b030613a669cc7ef199f90a8b" title="A 32-bit unsigned integer on all platforms.">dbus_uint32_t</a> *in_free_list_p,
<a name="l00413"></a>00413                           <a class="code" href="group__DBusTypes.html#gaf513803b030613a669cc7ef199f90a8b" title="A 32-bit unsigned integer on all platforms.">dbus_uint32_t</a> *allocated_p)
<a name="l00414"></a>00414 {
<a name="l00415"></a>00415   <a class="code" href="structDBusMemBlock.html" title="DBusMemBlock object represents a single malloc()-returned block that gets chunked up into objects in ...">DBusMemBlock</a> *block;
<a name="l00416"></a>00416   <a class="code" href="structDBusFreedElement.html" title="struct representing an element on the free list.">DBusFreedElement</a> *freed;
<a name="l00417"></a>00417   <a class="code" href="group__DBusTypes.html#gaf513803b030613a669cc7ef199f90a8b" title="A 32-bit unsigned integer on all platforms.">dbus_uint32_t</a> in_use = 0;
<a name="l00418"></a>00418   <a class="code" href="group__DBusTypes.html#gaf513803b030613a669cc7ef199f90a8b" title="A 32-bit unsigned integer on all platforms.">dbus_uint32_t</a> in_free_list = 0;
<a name="l00419"></a>00419   <a class="code" href="group__DBusTypes.html#gaf513803b030613a669cc7ef199f90a8b" title="A 32-bit unsigned integer on all platforms.">dbus_uint32_t</a> allocated = 0;
<a name="l00420"></a>00420 
<a name="l00421"></a>00421   <span class="keywordflow">if</span> (pool != <a class="code" href="group__DBusMacros.html#ga070d2ce7b6bb7e5c05602aa8c308d0c4" title="A null pointer, defined appropriately for C or C++.">NULL</a>)
<a name="l00422"></a>00422     {
<a name="l00423"></a>00423       in_use = pool-&gt;<a class="code" href="structDBusMemPool.html#a690c2330fce2db5cfdbe6b810d70c92f" title="size of a single object in the pool">element_size</a> * pool-&gt;<a class="code" href="structDBusMemPool.html#a23cd8af3ecb8cd88074b1934b1d7597c" title="Count of outstanding allocated elements.">allocated_elements</a>;
<a name="l00424"></a>00424 
<a name="l00425"></a>00425       <span class="keywordflow">for</span> (freed = pool-&gt;<a class="code" href="structDBusMemPool.html#af02ff4ac188a7a04a02ab140e568886b" title="a free list of elements to recycle">free_elements</a>; freed != <a class="code" href="group__DBusMacros.html#ga070d2ce7b6bb7e5c05602aa8c308d0c4" title="A null pointer, defined appropriately for C or C++.">NULL</a>; freed = freed-&gt;<a class="code" href="structDBusFreedElement.html#ac4819bebce960943155f9fbd4ab6e6c5" title="next element of the free list">next</a>)
<a name="l00426"></a>00426         {
<a name="l00427"></a>00427           in_free_list += pool-&gt;<a class="code" href="structDBusMemPool.html#a690c2330fce2db5cfdbe6b810d70c92f" title="size of a single object in the pool">element_size</a>;
<a name="l00428"></a>00428         }
<a name="l00429"></a>00429 
<a name="l00430"></a>00430       <span class="keywordflow">for</span> (block = pool-&gt;<a class="code" href="structDBusMemPool.html#a4682e065e26ee0dc4d2a17023cb41b8b" title="blocks of memory from malloc()">blocks</a>; block != <a class="code" href="group__DBusMacros.html#ga070d2ce7b6bb7e5c05602aa8c308d0c4" title="A null pointer, defined appropriately for C or C++.">NULL</a>; block = block-&gt;<a class="code" href="structDBusMemBlock.html#a88abbae4b7e92bfab8392c2aad2dae9b" title="next block in the list, which is already used up; only saved so we can free all the blocks when we fr...">next</a>)
<a name="l00431"></a>00431         {
<a name="l00432"></a>00432           <span class="keywordflow">if</span> (block == pool-&gt;<a class="code" href="structDBusMemPool.html#a4682e065e26ee0dc4d2a17023cb41b8b" title="blocks of memory from malloc()">blocks</a>)
<a name="l00433"></a>00433             allocated += pool-&gt;<a class="code" href="structDBusMemPool.html#a45cdcee97621d5a2bd85edd90d87d8bf" title="size of most recently allocated block">block_size</a>;
<a name="l00434"></a>00434           <span class="keywordflow">else</span>
<a name="l00435"></a>00435             allocated += block-&gt;<a class="code" href="structDBusMemBlock.html#ad23a73654095952ea4e2c222c41e5441" title="bytes of this block already allocated as elements.">used_so_far</a>;
<a name="l00436"></a>00436         }
<a name="l00437"></a>00437     }
<a name="l00438"></a>00438 
<a name="l00439"></a>00439   <span class="keywordflow">if</span> (in_use_p != <a class="code" href="group__DBusMacros.html#ga070d2ce7b6bb7e5c05602aa8c308d0c4" title="A null pointer, defined appropriately for C or C++.">NULL</a>)
<a name="l00440"></a>00440     *in_use_p = in_use;
<a name="l00441"></a>00441 
<a name="l00442"></a>00442   <span class="keywordflow">if</span> (in_free_list_p != <a class="code" href="group__DBusMacros.html#ga070d2ce7b6bb7e5c05602aa8c308d0c4" title="A null pointer, defined appropriately for C or C++.">NULL</a>)
<a name="l00443"></a>00443     *in_free_list_p = in_free_list;
<a name="l00444"></a>00444 
<a name="l00445"></a>00445   <span class="keywordflow">if</span> (allocated_p != <a class="code" href="group__DBusMacros.html#ga070d2ce7b6bb7e5c05602aa8c308d0c4" title="A null pointer, defined appropriately for C or C++.">NULL</a>)
<a name="l00446"></a>00446     *allocated_p = allocated;
<a name="l00447"></a>00447 }
<a name="l00448"></a>00448 <span class="preprocessor">#endif </span><span class="comment">/* DBUS_ENABLE_STATS */</span>
<a name="l00449"></a>00449 
<a name="l00452"></a>00452 <span class="preprocessor">#ifdef DBUS_ENABLE_EMBEDDED_TESTS</span>
<a name="l00453"></a>00453 <span class="preprocessor"></span><span class="preprocessor">#include &quot;dbus-test.h&quot;</span>
<a name="l00454"></a>00454 <span class="preprocessor">#include &lt;stdio.h&gt;</span>
<a name="l00455"></a>00455 <span class="preprocessor">#include &lt;time.h&gt;</span>
<a name="l00456"></a>00456 
<a name="l00457"></a>00457 <span class="keyword">static</span> <span class="keywordtype">void</span>
<a name="l00458"></a>00458 time_for_size (<span class="keywordtype">int</span> size)
<a name="l00459"></a>00459 {
<a name="l00460"></a>00460   <span class="keywordtype">int</span> i;
<a name="l00461"></a>00461   <span class="keywordtype">int</span> j;
<a name="l00462"></a>00462 <span class="preprocessor">#ifdef DBUS_ENABLE_VERBOSE_MODE</span>
<a name="l00463"></a>00463 <span class="preprocessor"></span>  clock_t start;
<a name="l00464"></a>00464   clock_t end;
<a name="l00465"></a>00465 <span class="preprocessor">#endif</span>
<a name="l00466"></a>00466 <span class="preprocessor"></span><span class="preprocessor">#define FREE_ARRAY_SIZE 512</span>
<a name="l00467"></a>00467 <span class="preprocessor"></span><span class="preprocessor">#define N_ITERATIONS FREE_ARRAY_SIZE * 512</span>
<a name="l00468"></a>00468 <span class="preprocessor"></span>  <span class="keywordtype">void</span> *to_free[FREE_ARRAY_SIZE];
<a name="l00469"></a>00469   <a class="code" href="structDBusMemPool.html" title="Internals fields of DBusMemPool.">DBusMemPool</a> *pool;
<a name="l00470"></a>00470 
<a name="l00471"></a>00471   _dbus_verbose (<span class="stringliteral">&quot;Timings for size %d\n&quot;</span>, size);
<a name="l00472"></a>00472   
<a name="l00473"></a>00473   _dbus_verbose (<span class="stringliteral">&quot; malloc\n&quot;</span>);
<a name="l00474"></a>00474   
<a name="l00475"></a>00475 <span class="preprocessor">#ifdef DBUS_ENABLE_VERBOSE_MODE</span>
<a name="l00476"></a>00476 <span class="preprocessor"></span>  start = clock ();
<a name="l00477"></a>00477 <span class="preprocessor">#endif</span>
<a name="l00478"></a>00478 <span class="preprocessor"></span>
<a name="l00479"></a>00479   i = 0;
<a name="l00480"></a>00480   j = 0;
<a name="l00481"></a>00481   <span class="keywordflow">while</span> (i &lt; N_ITERATIONS)
<a name="l00482"></a>00482     {
<a name="l00483"></a>00483       to_free[j] = <a class="code" href="group__DBusMemory.html#gaf6e588659067a854c3cca7ebe8ae5084" title="Allocates the given number of bytes, as with standard malloc().">dbus_malloc</a> (size);
<a name="l00484"></a>00484       _dbus_assert (to_free[j] != <a class="code" href="group__DBusMacros.html#ga070d2ce7b6bb7e5c05602aa8c308d0c4" title="A null pointer, defined appropriately for C or C++.">NULL</a>); <span class="comment">/* in a real app of course this is wrong */</span>
<a name="l00485"></a>00485 
<a name="l00486"></a>00486       ++j;
<a name="l00487"></a>00487 
<a name="l00488"></a>00488       <span class="keywordflow">if</span> (j == FREE_ARRAY_SIZE)
<a name="l00489"></a>00489         {
<a name="l00490"></a>00490           j = 0;
<a name="l00491"></a>00491           <span class="keywordflow">while</span> (j &lt; FREE_ARRAY_SIZE)
<a name="l00492"></a>00492             {
<a name="l00493"></a>00493               <a class="code" href="group__DBusMemory.html#ga34e666b19b015035a9a31e53da84b39a" title="Frees a block of memory previously allocated by dbus_malloc() or dbus_malloc0().">dbus_free</a> (to_free[j]);
<a name="l00494"></a>00494               ++j;
<a name="l00495"></a>00495             }
<a name="l00496"></a>00496 
<a name="l00497"></a>00497           j = 0;
<a name="l00498"></a>00498         }
<a name="l00499"></a>00499       
<a name="l00500"></a>00500       ++i;
<a name="l00501"></a>00501     }
<a name="l00502"></a>00502 
<a name="l00503"></a>00503 <span class="preprocessor">#ifdef DBUS_ENABLE_VERBOSE_MODE</span>
<a name="l00504"></a>00504 <span class="preprocessor"></span>  end = clock ();
<a name="l00505"></a>00505 
<a name="l00506"></a>00506   _dbus_verbose (<span class="stringliteral">&quot;  created/destroyed %d elements in %g seconds\n&quot;</span>,
<a name="l00507"></a>00507                  N_ITERATIONS, (end - start) / (<span class="keywordtype">double</span>) CLOCKS_PER_SEC);
<a name="l00508"></a>00508 
<a name="l00509"></a>00509 
<a name="l00510"></a>00510 
<a name="l00511"></a>00511   _dbus_verbose (<span class="stringliteral">&quot; mempools\n&quot;</span>);
<a name="l00512"></a>00512   
<a name="l00513"></a>00513   start = clock ();
<a name="l00514"></a>00514 <span class="preprocessor">#endif</span>
<a name="l00515"></a>00515 <span class="preprocessor"></span>
<a name="l00516"></a>00516   pool = <a class="code" href="group__DBusMemPool.html#gaf1bae02bc5fcb879f77ff2c13ca03ac8" title="Creates a new memory pool, or returns NULL on failure.">_dbus_mem_pool_new</a> (size, <a class="code" href="group__DBusMacros.html#gaa93f0eb578d23995850d61f7d61c55c1" title="Expands to &quot;0&quot;.">FALSE</a>);
<a name="l00517"></a>00517   
<a name="l00518"></a>00518   i = 0;
<a name="l00519"></a>00519   j = 0;
<a name="l00520"></a>00520   <span class="keywordflow">while</span> (i &lt; N_ITERATIONS)
<a name="l00521"></a>00521     {
<a name="l00522"></a>00522       to_free[j] = <a class="code" href="group__DBusMemPool.html#ga0946d54f767b4f55238f5a39c8543df1" title="Allocates an object from the memory pool.">_dbus_mem_pool_alloc</a> (pool); 
<a name="l00523"></a>00523       _dbus_assert (to_free[j] != <a class="code" href="group__DBusMacros.html#ga070d2ce7b6bb7e5c05602aa8c308d0c4" title="A null pointer, defined appropriately for C or C++.">NULL</a>);  <span class="comment">/* in a real app of course this is wrong */</span>
<a name="l00524"></a>00524 
<a name="l00525"></a>00525       ++j;
<a name="l00526"></a>00526 
<a name="l00527"></a>00527       <span class="keywordflow">if</span> (j == FREE_ARRAY_SIZE)
<a name="l00528"></a>00528         {
<a name="l00529"></a>00529           j = 0;
<a name="l00530"></a>00530           <span class="keywordflow">while</span> (j &lt; FREE_ARRAY_SIZE)
<a name="l00531"></a>00531             {
<a name="l00532"></a>00532               <a class="code" href="group__DBusMemPool.html#ga4e2feaefee7384ed940059e6c7b0a9d5" title="Deallocates an object previously created with _dbus_mem_pool_alloc().">_dbus_mem_pool_dealloc</a> (pool, to_free[j]);
<a name="l00533"></a>00533               ++j;
<a name="l00534"></a>00534             }
<a name="l00535"></a>00535 
<a name="l00536"></a>00536           j = 0;
<a name="l00537"></a>00537         }
<a name="l00538"></a>00538       
<a name="l00539"></a>00539       ++i;
<a name="l00540"></a>00540     }
<a name="l00541"></a>00541 
<a name="l00542"></a>00542   <a class="code" href="group__DBusMemPool.html#ga58e4f3def46410d5bb138a2b8f366b1a" title="Frees a memory pool (and all elements allocated from it).">_dbus_mem_pool_free</a> (pool);
<a name="l00543"></a>00543   
<a name="l00544"></a>00544 <span class="preprocessor">#ifdef DBUS_ENABLE_VERBOSE_MODE</span>
<a name="l00545"></a>00545 <span class="preprocessor"></span>  end = clock ();
<a name="l00546"></a>00546 
<a name="l00547"></a>00547   _dbus_verbose (<span class="stringliteral">&quot;  created/destroyed %d elements in %g seconds\n&quot;</span>,
<a name="l00548"></a>00548                  N_ITERATIONS, (end - start) / (<span class="keywordtype">double</span>) CLOCKS_PER_SEC);
<a name="l00549"></a>00549 
<a name="l00550"></a>00550   _dbus_verbose (<span class="stringliteral">&quot; zeroed malloc\n&quot;</span>);
<a name="l00551"></a>00551     
<a name="l00552"></a>00552   start = clock ();
<a name="l00553"></a>00553 <span class="preprocessor">#endif</span>
<a name="l00554"></a>00554 <span class="preprocessor"></span>  
<a name="l00555"></a>00555   i = 0;
<a name="l00556"></a>00556   j = 0;
<a name="l00557"></a>00557   <span class="keywordflow">while</span> (i &lt; N_ITERATIONS)
<a name="l00558"></a>00558     {
<a name="l00559"></a>00559       to_free[j] = <a class="code" href="group__DBusMemory.html#gaa02722b030a091f6c14c4cb11a593623" title="Allocates the given number of bytes, as with standard malloc(), but all bytes are initialized to zero...">dbus_malloc0</a> (size);
<a name="l00560"></a>00560       _dbus_assert (to_free[j] != <a class="code" href="group__DBusMacros.html#ga070d2ce7b6bb7e5c05602aa8c308d0c4" title="A null pointer, defined appropriately for C or C++.">NULL</a>); <span class="comment">/* in a real app of course this is wrong */</span>
<a name="l00561"></a>00561 
<a name="l00562"></a>00562       ++j;
<a name="l00563"></a>00563 
<a name="l00564"></a>00564       <span class="keywordflow">if</span> (j == FREE_ARRAY_SIZE)
<a name="l00565"></a>00565         {
<a name="l00566"></a>00566           j = 0;
<a name="l00567"></a>00567           <span class="keywordflow">while</span> (j &lt; FREE_ARRAY_SIZE)
<a name="l00568"></a>00568             {
<a name="l00569"></a>00569               <a class="code" href="group__DBusMemory.html#ga34e666b19b015035a9a31e53da84b39a" title="Frees a block of memory previously allocated by dbus_malloc() or dbus_malloc0().">dbus_free</a> (to_free[j]);
<a name="l00570"></a>00570               ++j;
<a name="l00571"></a>00571             }
<a name="l00572"></a>00572 
<a name="l00573"></a>00573           j = 0;
<a name="l00574"></a>00574         }
<a name="l00575"></a>00575       
<a name="l00576"></a>00576       ++i;
<a name="l00577"></a>00577     }
<a name="l00578"></a>00578 
<a name="l00579"></a>00579 <span class="preprocessor">#ifdef DBUS_ENABLE_VERBOSE_MODE</span>
<a name="l00580"></a>00580 <span class="preprocessor"></span>  end = clock ();
<a name="l00581"></a>00581 
<a name="l00582"></a>00582   _dbus_verbose (<span class="stringliteral">&quot;  created/destroyed %d elements in %g seconds\n&quot;</span>,
<a name="l00583"></a>00583                  N_ITERATIONS, (end - start) / (<span class="keywordtype">double</span>) CLOCKS_PER_SEC);
<a name="l00584"></a>00584   
<a name="l00585"></a>00585   _dbus_verbose (<span class="stringliteral">&quot; zeroed mempools\n&quot;</span>);
<a name="l00586"></a>00586   
<a name="l00587"></a>00587   start = clock ();
<a name="l00588"></a>00588 <span class="preprocessor">#endif</span>
<a name="l00589"></a>00589 <span class="preprocessor"></span>
<a name="l00590"></a>00590   pool = <a class="code" href="group__DBusMemPool.html#gaf1bae02bc5fcb879f77ff2c13ca03ac8" title="Creates a new memory pool, or returns NULL on failure.">_dbus_mem_pool_new</a> (size, <a class="code" href="group__DBusMacros.html#gaa8cecfc5c5c054d2875c03e77b7be15d" title="Expands to &quot;1&quot;.">TRUE</a>);
<a name="l00591"></a>00591   
<a name="l00592"></a>00592   i = 0;
<a name="l00593"></a>00593   j = 0;
<a name="l00594"></a>00594   <span class="keywordflow">while</span> (i &lt; N_ITERATIONS)
<a name="l00595"></a>00595     {
<a name="l00596"></a>00596       to_free[j] = <a class="code" href="group__DBusMemPool.html#ga0946d54f767b4f55238f5a39c8543df1" title="Allocates an object from the memory pool.">_dbus_mem_pool_alloc</a> (pool); 
<a name="l00597"></a>00597       _dbus_assert (to_free[j] != <a class="code" href="group__DBusMacros.html#ga070d2ce7b6bb7e5c05602aa8c308d0c4" title="A null pointer, defined appropriately for C or C++.">NULL</a>);  <span class="comment">/* in a real app of course this is wrong */</span>
<a name="l00598"></a>00598 
<a name="l00599"></a>00599       ++j;
<a name="l00600"></a>00600 
<a name="l00601"></a>00601       <span class="keywordflow">if</span> (j == FREE_ARRAY_SIZE)
<a name="l00602"></a>00602         {
<a name="l00603"></a>00603           j = 0;
<a name="l00604"></a>00604           <span class="keywordflow">while</span> (j &lt; FREE_ARRAY_SIZE)
<a name="l00605"></a>00605             {
<a name="l00606"></a>00606               <a class="code" href="group__DBusMemPool.html#ga4e2feaefee7384ed940059e6c7b0a9d5" title="Deallocates an object previously created with _dbus_mem_pool_alloc().">_dbus_mem_pool_dealloc</a> (pool, to_free[j]);
<a name="l00607"></a>00607               ++j;
<a name="l00608"></a>00608             }
<a name="l00609"></a>00609 
<a name="l00610"></a>00610           j = 0;
<a name="l00611"></a>00611         }
<a name="l00612"></a>00612       
<a name="l00613"></a>00613       ++i;
<a name="l00614"></a>00614     }
<a name="l00615"></a>00615 
<a name="l00616"></a>00616   <a class="code" href="group__DBusMemPool.html#ga58e4f3def46410d5bb138a2b8f366b1a" title="Frees a memory pool (and all elements allocated from it).">_dbus_mem_pool_free</a> (pool);
<a name="l00617"></a>00617   
<a name="l00618"></a>00618 <span class="preprocessor">#ifdef DBUS_ENABLE_VERBOSE_MODE</span>
<a name="l00619"></a>00619 <span class="preprocessor"></span>  end = clock ();
<a name="l00620"></a>00620 
<a name="l00621"></a>00621   _dbus_verbose (<span class="stringliteral">&quot;  created/destroyed %d elements in %g seconds\n&quot;</span>,
<a name="l00622"></a>00622                  N_ITERATIONS, (end - start) / (<span class="keywordtype">double</span>) CLOCKS_PER_SEC);
<a name="l00623"></a>00623 <span class="preprocessor">#endif</span>
<a name="l00624"></a>00624 <span class="preprocessor"></span>}
<a name="l00625"></a>00625 
<a name="l00631"></a>00631 <a class="code" href="group__DBusTypes.html#ga39c9cb0f3a2a8ad6f55cc4855d035349" title="A boolean, valid values are TRUE and FALSE.">dbus_bool_t</a>
<a name="l00632"></a>00632 _dbus_mem_pool_test (<span class="keywordtype">void</span>)
<a name="l00633"></a>00633 {
<a name="l00634"></a>00634   <span class="keywordtype">int</span> i;
<a name="l00635"></a>00635   <span class="keywordtype">int</span> element_sizes[] = { 4, 8, 16, 50, 124 };
<a name="l00636"></a>00636   
<a name="l00637"></a>00637   i = 0;
<a name="l00638"></a>00638   <span class="keywordflow">while</span> (i &lt; _DBUS_N_ELEMENTS (element_sizes))
<a name="l00639"></a>00639     {
<a name="l00640"></a>00640       time_for_size (element_sizes[i]);
<a name="l00641"></a>00641       ++i;
<a name="l00642"></a>00642     }
<a name="l00643"></a>00643   
<a name="l00644"></a>00644   <span class="keywordflow">return</span> <a class="code" href="group__DBusMacros.html#gaa8cecfc5c5c054d2875c03e77b7be15d" title="Expands to &quot;1&quot;.">TRUE</a>;
<a name="l00645"></a>00645 }
<a name="l00646"></a>00646 
<a name="l00647"></a>00647 <span class="preprocessor">#endif </span><span class="comment">/* DBUS_ENABLE_EMBEDDED_TESTS */</span>
</pre></div></div><!-- contents -->


<hr class="footer"/><address class="footer"><small>
Generated on Thu Mar 3 2016 17:50:30 for D-Bus by &#160;<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/>
</a> 1.7.6.1
</small></address>

</body>
</html>