1d012387afef0ba02185ebe27bc6bb15551912e92Havoc Pennington/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
217fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington/* dbus-mempool.h Memory pools
317fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington *
407a795f1db3b09beeec647643a4f263f617bc371Havoc Pennington * Copyright (C) 2002, 2003  Red Hat, Inc.
517fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington *
643605a6f4e78a8c28afb4b1e924dff0301e0e95cHavoc Pennington * Licensed under the Academic Free License version 2.1
717fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington *
817fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington * This program is free software; you can redistribute it and/or modify
917fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington * it under the terms of the GNU General Public License as published by
1017fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington * the Free Software Foundation; either version 2 of the License, or
1117fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington * (at your option) any later version.
1217fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington *
1317fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington * This program is distributed in the hope that it will be useful,
1417fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington * but WITHOUT ANY WARRANTY; without even the implied warranty of
1517fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
1617fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington * GNU General Public License for more details.
1717fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington *
1817fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington * You should have received a copy of the GNU General Public License
1917fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington * along with this program; if not, write to the Free Software
205baf2f856a9c6625993234855b07680da1c8916fTobias Mueller * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
2117fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington *
2217fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington */
2317fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington
24dbecdeabb20e0ce11121819c63373f0afba57c58Marcus Brinkmann#include <config.h>
2517fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington#include "dbus-mempool.h"
26ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington#include "dbus-internals.h"
2717fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington
2817fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington/**
2917fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington * @defgroup DBusMemPool memory pools
3017fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington * @ingroup  DBusInternals
3117fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington * @brief DBusMemPool object
3217fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington *
3317fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington * Types and functions related to DBusMemPool.  A memory pool is used
3417fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington * to decrease memory fragmentation/overhead and increase speed for
3517fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington * blocks of small uniformly-sized objects. The main point is to avoid
3617fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington * the overhead of a malloc block for each small object, speed is
3717fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington * secondary.
3817fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington */
3917fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington
4017fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington/**
4117fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington * @defgroup DBusMemPoolInternals Memory pool implementation details
4217fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington * @ingroup  DBusInternals
4317fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington * @brief DBusMemPool implementation details
4417fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington *
4517fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington * The guts of DBusMemPool.
4617fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington *
4717fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington * @{
4817fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington */
4917fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington
5017fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington/**
5117fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington * typedef so DBusFreedElement struct can refer to itself.
5217fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington */
5317fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Penningtontypedef struct DBusFreedElement DBusFreedElement;
5417fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington
5517fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington/**
5617fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington * struct representing an element on the free list.
5717fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington * We just cast freed elements to this so we can
5817fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington * make a list out of them.
5917fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington */
6017fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Penningtonstruct DBusFreedElement
6117fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington{
6217fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington  DBusFreedElement *next; /**< next element of the free list */
6317fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington};
6417fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington
6517fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington/**
6617fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington * The dummy size of the variable-length "elements"
6717fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington * field in DBusMemBlock
6817fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington */
6917fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington#define ELEMENT_PADDING 4
7017fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington
7117fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington/**
7217fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington * Typedef for DBusMemBlock so the struct can recursively
7317fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington * point to itself.
7417fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington */
7517fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Penningtontypedef struct DBusMemBlock DBusMemBlock;
7617fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington
7717fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington/**
7817fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington * DBusMemBlock object represents a single malloc()-returned
7917fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington * block that gets chunked up into objects in the memory pool.
8017fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington */
8117fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Penningtonstruct DBusMemBlock
8217fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington{
8317fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington  DBusMemBlock *next;  /**< next block in the list, which is already used up;
8417fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington                        *   only saved so we can free all the blocks
8517fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington                        *   when we free the mem pool.
8617fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington                        */
8717fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington
88bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington  /* this is a long so that "elements" is aligned */
89bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington  long used_so_far;     /**< bytes of this block already allocated as elements. */
9017fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington
9117fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington  unsigned char elements[ELEMENT_PADDING]; /**< the block data, actually allocated to required size */
9217fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington};
9317fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington
9417fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington/**
9517fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington * Internals fields of DBusMemPool
9617fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington */
9717fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Penningtonstruct DBusMemPool
9817fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington{
9917fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington  int element_size;                /**< size of a single object in the pool */
10017fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington  int block_size;                  /**< size of most recently allocated block */
10117fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington  unsigned int zero_elements : 1;  /**< whether to zero-init allocated elements */
10217fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington
10317fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington  DBusFreedElement *free_elements; /**< a free list of elements to recycle */
10417fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington  DBusMemBlock *blocks;            /**< blocks of memory from malloc() */
105ebb57e719c32becd95a1efe3dd269c21e5a011b6Havoc Pennington  int allocated_elements;          /**< Count of outstanding allocated elements */
10617fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington};
10717fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington
10817fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington/** @} */
10917fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington
11017fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington/**
11117fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington * @addtogroup DBusMemPool
11217fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington *
11317fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington * @{
11417fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington */
11517fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington
11617fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington/**
11717fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington * @typedef DBusMemPool
11817fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington *
11917fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington * Opaque object representing a memory pool. Memory pools allow
12017fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington * avoiding per-malloc-block memory overhead when allocating a lot of
12117fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington * small objects that are all the same size. They are slightly
12217fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington * faster than calling malloc() also.
12317fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington */
12417fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington
12517fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington/**
12617fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington * Creates a new memory pool, or returns #NULL on failure.  Objects in
12717fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington * the pool must be at least sizeof(void*) bytes each, due to the way
12817fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington * memory pools work. To avoid creating 64 bit problems, this means at
12917fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington * least 8 bytes on all platforms, unless you are 4 bytes on 32-bit
13017fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington * and 8 bytes on 64-bit.
13117fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington *
13217fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington * @param element_size size of an element allocated from the pool.
13317fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington * @param zero_elements whether to zero-initialize elements
13417fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington * @returns the new pool or #NULL
13517fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington */
13617fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc PenningtonDBusMemPool*
13717fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington_dbus_mem_pool_new (int element_size,
13817fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington                    dbus_bool_t zero_elements)
13917fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington{
14017fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington  DBusMemPool *pool;
14117fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington
14217fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington  pool = dbus_new0 (DBusMemPool, 1);
14317fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington  if (pool == NULL)
14417fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington    return NULL;
14517fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington
146bc1d2b04e5af52a95c7c6b4181f05d082d079df5Anders Carlsson  /* Make the element size at least 8 bytes. */
147bc1d2b04e5af52a95c7c6b4181f05d082d079df5Anders Carlsson  if (element_size < 8)
148bc1d2b04e5af52a95c7c6b4181f05d082d079df5Anders Carlsson    element_size = 8;
149bc1d2b04e5af52a95c7c6b4181f05d082d079df5Anders Carlsson
15017fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington  /* these assertions are equivalent but the first is more clear
15117fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington   * to programmers that see it fail.
15217fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington   */
15317fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington  _dbus_assert (element_size >= (int) sizeof (void*));
15417fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington  _dbus_assert (element_size >= (int) sizeof (DBusFreedElement));
15589ee9e6abf40b594c681479dfc4d18d892c93838Anders Carlsson
15689ee9e6abf40b594c681479dfc4d18d892c93838Anders Carlsson  /* align the element size to a pointer boundary so we won't get bus
15789ee9e6abf40b594c681479dfc4d18d892c93838Anders Carlsson   * errors under other architectures.
15889ee9e6abf40b594c681479dfc4d18d892c93838Anders Carlsson   */
15989ee9e6abf40b594c681479dfc4d18d892c93838Anders Carlsson  pool->element_size = _DBUS_ALIGN_VALUE (element_size, sizeof (void *));
16089ee9e6abf40b594c681479dfc4d18d892c93838Anders Carlsson
16117fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington  pool->zero_elements = zero_elements != FALSE;
16217fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington
163ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington  pool->allocated_elements = 0;
164ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington
16517fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington  /* pick a size for the first block; it increases
16617fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington   * for each block we need to allocate. This is
16717fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington   * actually half the initial block size
16817fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington   * since _dbus_mem_pool_alloc() unconditionally
16989ee9e6abf40b594c681479dfc4d18d892c93838Anders Carlsson   * doubles it prior to creating a new block.  */
17089ee9e6abf40b594c681479dfc4d18d892c93838Anders Carlsson  pool->block_size = pool->element_size * 8;
17117fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington
17217fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington  _dbus_assert ((pool->block_size %
17317fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington                 pool->element_size) == 0);
17417fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington
17517fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington  return pool;
17617fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington}
17717fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington
17817fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington/**
17917fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington * Frees a memory pool (and all elements allocated from it).
18017fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington *
18117fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington * @param pool the memory pool.
18217fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington */
18317fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Penningtonvoid
18417fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington_dbus_mem_pool_free (DBusMemPool *pool)
18517fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington{
18617fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington  DBusMemBlock *block;
18717fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington
18817fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington  block = pool->blocks;
18917fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington  while (block != NULL)
19017fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington    {
19117fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington      DBusMemBlock *next = block->next;
19217fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington
19317fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington      dbus_free (block);
19417fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington
19517fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington      block = next;
19617fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington    }
19717fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington
19817fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington  dbus_free (pool);
19917fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington}
20017fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington
20117fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington/**
20217fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington * Allocates an object from the memory pool.
20317fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington * The object must be freed with _dbus_mem_pool_dealloc().
20417fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington *
20517fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington * @param pool the memory pool
20617fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington * @returns the allocated object or #NULL if no memory.
20717fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington */
20817fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Penningtonvoid*
20917fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington_dbus_mem_pool_alloc (DBusMemPool *pool)
21017fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington{
21127b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington#ifdef DBUS_BUILD_TESTS
212ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington  if (_dbus_disable_mem_pools ())
21317fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington    {
214ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington      DBusMemBlock *block;
215ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington      int alloc_size;
216ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington
217ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington      /* This is obviously really silly, but it's
218ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington       * debug-mode-only code that is compiled out
219ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington       * when tests are disabled (_dbus_disable_mem_pools()
220ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington       * is a constant expression FALSE so this block
221ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington       * should vanish)
222ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington       */
223ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington
224ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington      alloc_size = sizeof (DBusMemBlock) - ELEMENT_PADDING +
225ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington        pool->element_size;
226ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington
227ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington      if (pool->zero_elements)
228ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington        block = dbus_malloc0 (alloc_size);
229ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington      else
230ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington        block = dbus_malloc (alloc_size);
23117fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington
232ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington      if (block != NULL)
233ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington        {
234ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington          block->next = pool->blocks;
235ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington          pool->blocks = block;
236ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington          pool->allocated_elements += 1;
23717fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington
238ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington          return (void*) &block->elements[0];
239ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington        }
240ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington      else
241ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington        return NULL;
24217fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington    }
24317fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington  else
24427b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington#endif
24517fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington    {
246ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington      if (_dbus_decrement_fail_alloc_counter ())
247ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington        {
248ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington          _dbus_verbose (" FAILING mempool alloc\n");
249ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington          return NULL;
250ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington        }
251ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington      else if (pool->free_elements)
252ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington        {
253ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington          DBusFreedElement *element = pool->free_elements;
254ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington
255ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington          pool->free_elements = pool->free_elements->next;
256ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington
257ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington          if (pool->zero_elements)
258ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington            memset (element, '\0', pool->element_size);
259ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington
260ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington          pool->allocated_elements += 1;
261bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington
262ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington          return element;
263ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington        }
264ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington      else
26517fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington        {
266ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington          void *element;
267ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington
268ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington          if (pool->blocks == NULL ||
269ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington              pool->blocks->used_so_far == pool->block_size)
270ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington            {
271ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington              /* Need a new block */
272ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington              DBusMemBlock *block;
273ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington              int alloc_size;
27407a795f1db3b09beeec647643a4f263f617bc371Havoc Pennington#ifdef DBUS_BUILD_TESTS
275ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington              int saved_counter;
27607a795f1db3b09beeec647643a4f263f617bc371Havoc Pennington#endif
27707a795f1db3b09beeec647643a4f263f617bc371Havoc Pennington
278ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington              if (pool->block_size <= _DBUS_INT_MAX / 4) /* avoid overflow */
279ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington                {
280ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington                  /* use a larger block size for our next block */
281ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington                  pool->block_size *= 2;
282ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington                  _dbus_assert ((pool->block_size %
283ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington                                 pool->element_size) == 0);
284ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington                }
28517fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington
286ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington              alloc_size = sizeof (DBusMemBlock) - ELEMENT_PADDING + pool->block_size;
28707a795f1db3b09beeec647643a4f263f617bc371Havoc Pennington
28807a795f1db3b09beeec647643a4f263f617bc371Havoc Pennington#ifdef DBUS_BUILD_TESTS
289ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington              /* We save/restore the counter, so that memory pools won't
290ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington               * cause a given function to have different number of
291ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington               * allocations on different invocations. i.e.  when testing
292ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington               * we want consistent alloc patterns. So we skip our
293ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington               * malloc here for purposes of failed alloc simulation.
294ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington               */
295ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington              saved_counter = _dbus_get_fail_alloc_counter ();
296ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington              _dbus_set_fail_alloc_counter (_DBUS_INT_MAX);
29707a795f1db3b09beeec647643a4f263f617bc371Havoc Pennington#endif
29817fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington
299ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington              if (pool->zero_elements)
300ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington                block = dbus_malloc0 (alloc_size);
301ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington              else
302ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington                block = dbus_malloc (alloc_size);
30317fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington
30407a795f1db3b09beeec647643a4f263f617bc371Havoc Pennington#ifdef DBUS_BUILD_TESTS
305ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington              _dbus_set_fail_alloc_counter (saved_counter);
306ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington              _dbus_assert (saved_counter == _dbus_get_fail_alloc_counter ());
30707a795f1db3b09beeec647643a4f263f617bc371Havoc Pennington#endif
30807a795f1db3b09beeec647643a4f263f617bc371Havoc Pennington
309ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington              if (block == NULL)
310ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington                return NULL;
31117fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington
312ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington              block->used_so_far = 0;
313ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington              block->next = pool->blocks;
314ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington              pool->blocks = block;
315ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington            }
31617fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington
317ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington          element = &pool->blocks->elements[pool->blocks->used_so_far];
318bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington
319ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington          pool->blocks->used_so_far += pool->element_size;
32017fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington
321ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington          pool->allocated_elements += 1;
322bc86794f23fa538a405813fb61b531c2eacc9ae1Havoc Pennington
323ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington          return element;
324ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington        }
32517fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington    }
32617fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington}
32717fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington
32817fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington/**
32917fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington * Deallocates an object previously created with
33017fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington * _dbus_mem_pool_alloc(). The previous object
33117fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington * must have come from this same pool.
33217fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington * @param pool the memory pool
33317fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington * @param element the element earlier allocated.
334ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington * @returns #TRUE if there are no remaining allocated elements
33517fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington */
336ce173b29fc1e9432cb5956952afdbe775da12415Havoc Penningtondbus_bool_t
33717fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington_dbus_mem_pool_dealloc (DBusMemPool *pool,
33817fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington                        void        *element)
33917fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington{
34027b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington#ifdef DBUS_BUILD_TESTS
341ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington  if (_dbus_disable_mem_pools ())
342ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington    {
343ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington      DBusMemBlock *block;
344ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington      DBusMemBlock *prev;
345ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington
346ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington      /* mmm, fast. ;-) debug-only code, so doesn't matter. */
347ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington
348ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington      prev = NULL;
349ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington      block = pool->blocks;
35017fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington
351ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington      while (block != NULL)
352ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington        {
353ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington          if (block->elements == (unsigned char*) element)
354ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington            {
355ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington              if (prev)
356ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington                prev->next = block->next;
357ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington              else
358ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington                pool->blocks = block->next;
359ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington
360ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington              dbus_free (block);
361ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington
362ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington              _dbus_assert (pool->allocated_elements > 0);
363ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington              pool->allocated_elements -= 1;
364ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington
365ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington              if (pool->allocated_elements == 0)
366ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington                _dbus_assert (pool->blocks == NULL);
367ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington
368ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington              return pool->blocks == NULL;
369ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington            }
370ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington          prev = block;
371ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington          block = block->next;
372ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington        }
373ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington
374ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington      _dbus_assert_not_reached ("freed nonexistent block");
375ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington      return FALSE;
376ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington    }
377ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington  else
37827b694f6e109c78c633ddb8d96f524e46e536f4eHavoc Pennington#endif
379ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington    {
380ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington      DBusFreedElement *freed;
381ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington
382ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington      freed = element;
383ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington      freed->next = pool->free_elements;
384ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington      pool->free_elements = freed;
385ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington
386ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington      _dbus_assert (pool->allocated_elements > 0);
387ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington      pool->allocated_elements -= 1;
388ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington
389ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington      return pool->allocated_elements == 0;
390ce173b29fc1e9432cb5956952afdbe775da12415Havoc Pennington    }
39117fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington}
39217fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington
39317fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington/** @} */
39417fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington
39517fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington#ifdef DBUS_BUILD_TESTS
39617fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington#include "dbus-test.h"
39717fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington#include <stdio.h>
39817fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington#include <time.h>
39917fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington
40017fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Penningtonstatic void
40117fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Penningtontime_for_size (int size)
40217fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington{
40317fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington  int i;
40417fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington  int j;
40517fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington  clock_t start;
40617fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington  clock_t end;
40717fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington#define FREE_ARRAY_SIZE 512
40817fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington#define N_ITERATIONS FREE_ARRAY_SIZE * 512
40917fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington  void *to_free[FREE_ARRAY_SIZE];
41017fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington  DBusMemPool *pool;
41117fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington
41205a4ad6994919b352b5229d0b1b0a8ebebe2a42fHavoc Pennington  _dbus_verbose ("Timings for size %d\n", size);
41317fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington
41405a4ad6994919b352b5229d0b1b0a8ebebe2a42fHavoc Pennington  _dbus_verbose (" malloc\n");
41517fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington
41617fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington  start = clock ();
41717fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington
41817fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington  i = 0;
41917fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington  j = 0;
42017fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington  while (i < N_ITERATIONS)
42117fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington    {
42217fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington      to_free[j] = dbus_malloc (size);
42317fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington      _dbus_assert (to_free[j] != NULL); /* in a real app of course this is wrong */
42417fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington
42517fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington      ++j;
42617fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington
42717fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington      if (j == FREE_ARRAY_SIZE)
42817fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington        {
42917fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington          j = 0;
43017fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington          while (j < FREE_ARRAY_SIZE)
43117fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington            {
43217fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington              dbus_free (to_free[j]);
43317fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington              ++j;
43417fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington            }
43517fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington
43617fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington          j = 0;
43717fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington        }
43817fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington
43917fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington      ++i;
44017fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington    }
44117fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington
44217fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington  end = clock ();
44317fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington
44405a4ad6994919b352b5229d0b1b0a8ebebe2a42fHavoc Pennington  _dbus_verbose ("  created/destroyed %d elements in %g seconds\n",
44505a4ad6994919b352b5229d0b1b0a8ebebe2a42fHavoc Pennington                 N_ITERATIONS, (end - start) / (double) CLOCKS_PER_SEC);
44617fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington
44717fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington
44817fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington
44905a4ad6994919b352b5229d0b1b0a8ebebe2a42fHavoc Pennington  _dbus_verbose (" mempools\n");
45017fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington
45117fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington  start = clock ();
45217fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington
45317fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington  pool = _dbus_mem_pool_new (size, FALSE);
45417fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington
45517fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington  i = 0;
45617fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington  j = 0;
45717fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington  while (i < N_ITERATIONS)
45817fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington    {
45917fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington      to_free[j] = _dbus_mem_pool_alloc (pool);
46017fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington      _dbus_assert (to_free[j] != NULL);  /* in a real app of course this is wrong */
46117fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington
46217fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington      ++j;
46317fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington
46417fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington      if (j == FREE_ARRAY_SIZE)
46517fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington        {
46617fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington          j = 0;
46717fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington          while (j < FREE_ARRAY_SIZE)
46817fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington            {
46917fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington              _dbus_mem_pool_dealloc (pool, to_free[j]);
47017fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington              ++j;
47117fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington            }
47217fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington
47317fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington          j = 0;
47417fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington        }
47517fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington
47617fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington      ++i;
47717fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington    }
47817fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington
47917fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington  _dbus_mem_pool_free (pool);
48017fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington
48117fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington  end = clock ();
48217fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington
48305a4ad6994919b352b5229d0b1b0a8ebebe2a42fHavoc Pennington  _dbus_verbose ("  created/destroyed %d elements in %g seconds\n",
48405a4ad6994919b352b5229d0b1b0a8ebebe2a42fHavoc Pennington                 N_ITERATIONS, (end - start) / (double) CLOCKS_PER_SEC);
48517fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington
48605a4ad6994919b352b5229d0b1b0a8ebebe2a42fHavoc Pennington  _dbus_verbose (" zeroed malloc\n");
48717fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington
48817fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington  start = clock ();
48917fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington
49017fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington  i = 0;
49117fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington  j = 0;
49217fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington  while (i < N_ITERATIONS)
49317fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington    {
49417fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington      to_free[j] = dbus_malloc0 (size);
49517fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington      _dbus_assert (to_free[j] != NULL); /* in a real app of course this is wrong */
49617fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington
49717fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington      ++j;
49817fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington
49917fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington      if (j == FREE_ARRAY_SIZE)
50017fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington        {
50117fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington          j = 0;
50217fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington          while (j < FREE_ARRAY_SIZE)
50317fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington            {
50417fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington              dbus_free (to_free[j]);
50517fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington              ++j;
50617fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington            }
50717fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington
50817fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington          j = 0;
50917fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington        }
51017fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington
51117fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington      ++i;
51217fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington    }
51317fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington
51417fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington  end = clock ();
51517fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington
51605a4ad6994919b352b5229d0b1b0a8ebebe2a42fHavoc Pennington  _dbus_verbose ("  created/destroyed %d elements in %g seconds\n",
51705a4ad6994919b352b5229d0b1b0a8ebebe2a42fHavoc Pennington                 N_ITERATIONS, (end - start) / (double) CLOCKS_PER_SEC);
51817fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington
51905a4ad6994919b352b5229d0b1b0a8ebebe2a42fHavoc Pennington  _dbus_verbose (" zeroed mempools\n");
52017fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington
52117fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington  start = clock ();
52217fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington
52317fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington  pool = _dbus_mem_pool_new (size, TRUE);
52417fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington
52517fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington  i = 0;
52617fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington  j = 0;
52717fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington  while (i < N_ITERATIONS)
52817fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington    {
52917fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington      to_free[j] = _dbus_mem_pool_alloc (pool);
53017fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington      _dbus_assert (to_free[j] != NULL);  /* in a real app of course this is wrong */
53117fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington
53217fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington      ++j;
53317fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington
53417fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington      if (j == FREE_ARRAY_SIZE)
53517fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington        {
53617fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington          j = 0;
53717fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington          while (j < FREE_ARRAY_SIZE)
53817fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington            {
53917fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington              _dbus_mem_pool_dealloc (pool, to_free[j]);
54017fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington              ++j;
54117fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington            }
54217fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington
54317fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington          j = 0;
54417fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington        }
54517fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington
54617fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington      ++i;
54717fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington    }
54817fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington
54917fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington  _dbus_mem_pool_free (pool);
55017fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington
55117fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington  end = clock ();
55217fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington
55305a4ad6994919b352b5229d0b1b0a8ebebe2a42fHavoc Pennington  _dbus_verbose ("  created/destroyed %d elements in %g seconds\n",
55405a4ad6994919b352b5229d0b1b0a8ebebe2a42fHavoc Pennington                 N_ITERATIONS, (end - start) / (double) CLOCKS_PER_SEC);
55517fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington}
55617fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington
55717fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington/**
55817fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington * @ingroup DBusMemPoolInternals
55917fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington * Unit test for DBusMemPool
56017fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington * @returns #TRUE on success.
56117fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington */
56217fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Penningtondbus_bool_t
56317fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington_dbus_mem_pool_test (void)
56417fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington{
56517fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington  int i;
56617fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington  int element_sizes[] = { 4, 8, 16, 50, 124 };
56717fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington
56817fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington  i = 0;
56917fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington  while (i < _DBUS_N_ELEMENTS (element_sizes))
57017fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington    {
57117fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington      time_for_size (element_sizes[i]);
57217fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington      ++i;
57317fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington    }
57417fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington
57517fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington  return TRUE;
57617fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington}
57717fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington
57817fbe2b702cdc880abd6cbe117e620b6432f42e0Havoc Pennington#endif /* DBUS_BUILD_TESTS */
579