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