| 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
 <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 Page</span></a></li>
<li><a href="pages.html"><span>Related Pages</span></a></li>
<li><a href="modules.html"><span>Modules</span></a></li>
<li><a href="annotated.html"><span>Data 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 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: "gnu"; 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 <config.h></span>
<a name="l00025"></a>00025 <span class="preprocessor">#include "dbus-mempool.h"</span>
<a name="l00026"></a>00026 <span class="preprocessor">#include "dbus-internals.h"</span>
<a name="l00027"></a>00027 <span class="preprocessor">#include "dbus-valgrind-internal.h"</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 "elements" 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 "elements" 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 < 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 >= (<span class="keywordtype">int</span>) <span class="keyword">sizeof</span> (<span class="keywordtype">void</span>*));
<a name="l00155"></a>00155 _dbus_assert (element_size >= (<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'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-><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-><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 "0".">FALSE</a>;
<a name="l00163"></a>00163
<a name="l00164"></a>00164 pool-><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-><a class="code" href="structDBusMemPool.html#a45cdcee97621d5a2bd85edd90d87d8bf" title="size of most recently allocated block">block_size</a> = pool-><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-><a class="code" href="structDBusMemPool.html#a45cdcee97621d5a2bd85edd90d87d8bf" title="size of most recently allocated block">block_size</a> %
<a name="l00174"></a>00174 pool-><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-><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-><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'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 "elements" field in DBusMemBlock.">ELEMENT_PADDING</a> +
<a name="l00230"></a>00230 pool-><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-><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-><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-><a class="code" href="structDBusMemPool.html#a4682e065e26ee0dc4d2a17023cb41b8b" title="blocks of memory from malloc()">blocks</a>;
<a name="l00240"></a>00240 pool-><a class="code" href="structDBusMemPool.html#a4682e065e26ee0dc4d2a17023cb41b8b" title="blocks of memory from malloc()">blocks</a> = block;
<a name="l00241"></a>00241 pool-><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> *) &block-><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-><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>*) &block-><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">" FAILING mempool alloc\n"</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-><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-><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-><a class="code" href="structDBusMemPool.html#af02ff4ac188a7a04a02ab140e568886b" title="a free list of elements to recycle">free_elements</a> = pool-><a class="code" href="structDBusMemPool.html#af02ff4ac188a7a04a02ab140e568886b" title="a free list of elements to recycle">free_elements</a>-><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-><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-><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">'\0'</span>, pool-><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-><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-><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-><a class="code" href="structDBusMemPool.html#a4682e065e26ee0dc4d2a17023cb41b8b" title="blocks of memory from malloc()">blocks</a>-><a class="code" href="structDBusMemBlock.html#ad23a73654095952ea4e2c222c41e5441" title="bytes of this block already allocated as elements.">used_so_far</a> == pool-><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-><a class="code" href="structDBusMemPool.html#a45cdcee97621d5a2bd85edd90d87d8bf" title="size of most recently allocated block">block_size</a> <= _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-><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-><a class="code" href="structDBusMemPool.html#a45cdcee97621d5a2bd85edd90d87d8bf" title="size of most recently allocated block">block_size</a> %
<a name="l00292"></a>00292 pool-><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 "elements" field in DBusMemBlock.">ELEMENT_PADDING</a> + pool-><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'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-><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-><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-><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-><a class="code" href="structDBusMemPool.html#a4682e065e26ee0dc4d2a17023cb41b8b" title="blocks of memory from malloc()">blocks</a>;
<a name="l00323"></a>00323 pool-><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 = &pool-><a class="code" href="structDBusMemPool.html#a4682e065e26ee0dc4d2a17023cb41b8b" title="blocks of memory from malloc()">blocks</a>-><a class="code" href="structDBusMemBlock.html#af685833ddb17150a20cbe538f23f3113" title="the block data, actually allocated to required size">elements</a>[pool-><a class="code" href="structDBusMemPool.html#a4682e065e26ee0dc4d2a17023cb41b8b" title="blocks of memory from malloc()">blocks</a>-><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-><a class="code" href="structDBusMemPool.html#a4682e065e26ee0dc4d2a17023cb41b8b" title="blocks of memory from malloc()">blocks</a>-><a class="code" href="structDBusMemBlock.html#ad23a73654095952ea4e2c222c41e5441" title="bytes of this block already allocated as elements.">used_so_far</a> += pool-><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-><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-><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'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-><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-><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-><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-><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-><a class="code" href="structDBusMemPool.html#a4682e065e26ee0dc4d2a17023cb41b8b" title="blocks of memory from malloc()">blocks</a> = block-><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-><a class="code" href="structDBusMemPool.html#a23cd8af3ecb8cd88074b1934b1d7597c" title="Count of outstanding allocated elements.">allocated_elements</a> > 0);
<a name="l00375"></a>00375 pool-><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-><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-><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-><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-><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">"freed nonexistent block"</span>);
<a name="l00387"></a>00387 <span class="keywordflow">return</span> <a class="code" href="group__DBusMacros.html#gaa93f0eb578d23995850d61f7d61c55c1" title="Expands to "0".">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-><a class="code" href="structDBusFreedElement.html#ac4819bebce960943155f9fbd4ab6e6c5" title="next element of the free list">next</a> = pool-><a class="code" href="structDBusMemPool.html#af02ff4ac188a7a04a02ab140e568886b" title="a free list of elements to recycle">free_elements</a>;
<a name="l00399"></a>00399 pool-><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-><a class="code" href="structDBusMemPool.html#a23cd8af3ecb8cd88074b1934b1d7597c" title="Count of outstanding allocated elements.">allocated_elements</a> > 0);
<a name="l00402"></a>00402 pool-><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-><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-><a class="code" href="structDBusMemPool.html#a690c2330fce2db5cfdbe6b810d70c92f" title="size of a single object in the pool">element_size</a> * pool-><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-><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-><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-><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-><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-><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-><a class="code" href="structDBusMemPool.html#a4682e065e26ee0dc4d2a17023cb41b8b" title="blocks of memory from malloc()">blocks</a>)
<a name="l00433"></a>00433 allocated += pool-><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-><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 "dbus-test.h"</span>
<a name="l00454"></a>00454 <span class="preprocessor">#include <stdio.h></span>
<a name="l00455"></a>00455 <span class="preprocessor">#include <time.h></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">"Timings for size %d\n"</span>, size);
<a name="l00472"></a>00472
<a name="l00473"></a>00473 _dbus_verbose (<span class="stringliteral">" malloc\n"</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 < 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 < 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">" created/destroyed %d elements in %g seconds\n"</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">" mempools\n"</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 "0".">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 < 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 < 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">" created/destroyed %d elements in %g seconds\n"</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">" zeroed malloc\n"</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 < 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 < 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">" created/destroyed %d elements in %g seconds\n"</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">" zeroed mempools\n"</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 "1".">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 < 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 < 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">" created/destroyed %d elements in %g seconds\n"</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 < _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 "1".">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  <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>