1663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
2663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/*--------------------------------------------------------------------*/
3436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov/*--- A simple pool (memory) allocator.       pub_tool_poolalloc.h ---*/
4663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/*--------------------------------------------------------------------*/
5663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
6663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/*
7663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   This file is part of Valgrind, a dynamic binary instrumentation
8663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   framework.
9663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
10436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   Copyright (C) 2011-2013 OpenWorks LLP info@open-works.co.uk,
11663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                           Philippe Waroquiers philippe.waroquiers@skynet.be
12663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
13663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   This program is free software; you can redistribute it and/or
14663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   modify it under the terms of the GNU General Public License as
15663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   published by the Free Software Foundation; either version 2 of the
16663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   License, or (at your option) any later version.
17663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
18663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   This program is distributed in the hope that it will be useful, but
19663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   WITHOUT ANY WARRANTY; without even the implied warranty of
20663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
21663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   General Public License for more details.
22663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
23663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   You should have received a copy of the GNU General Public License
24663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   along with this program; if not, write to the Free Software
25663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
26663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   02111-1307, USA.
27663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
28663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   The GNU General Public License is contained in the file COPYING.
29663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng*/
30663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
31436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#ifndef __PUB_TOOL_POOLALLOC_H
32436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#define __PUB_TOOL_POOLALLOC_H
33436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov
34436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov#include "pub_tool_basics.h"   // UWord
35663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
36663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng//--------------------------------------------------------------------
37663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng// PURPOSE: Provides efficient allocation and free of elements of
38663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng// the same size.
39663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng// This pool allocator manages elements alloc/free by allocating
40663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng// "pools" of many elements from a lower level allocator (typically
41663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng// pub_tool_mallocfree.h).
42663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng// Single elements can then be allocated and released from these pools.
43663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng// A pool allocator is faster and has less memory overhead than
44663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng// calling directly pub_tool_mallocfree.h
45663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng// Note: the pools of elements are not freed, even if all the
46663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng// single elements have been freed. The only way to free the underlying
47663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng// pools of elements is to delete the pool allocator.
48663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng//--------------------------------------------------------------------
49663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
50663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
51663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengtypedef  struct _PoolAlloc  PoolAlloc;
52663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
53663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* Create new PoolAlloc, using given allocation and free function, and
54663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   for elements of the specified size.  Alloc fn must not fail (that
55663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   is, if it returns it must have succeeded.) */
56663860b1408516d02ebfcb3a9999a134e6cfb223Ben ChengPoolAlloc* VG_(newPA) ( UWord  elemSzB,
57663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                        UWord  nPerPool,
58436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        void*  (*alloc)(const HChar*, SizeT),
59436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov                        const  HChar* cc,
60663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                        void   (*free_fn)(void*) );
61663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
62663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
63663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* Free all memory associated with a PoolAlloc. */
64663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengextern void VG_(deletePA) ( PoolAlloc* pa);
65663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
66663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* Allocates an element from pa. */
67663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengextern void* VG_(allocEltPA) ( PoolAlloc* pa);
68663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
69663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* Free element of pa. */
70663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengextern void VG_(freeEltPA) ( PoolAlloc* pa, void* p);
71663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
72663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/* A pool allocator can be shared between multiple data structures.
73663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   For example, multiple OSet* can allocate/free nodes from the same
74663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   pool allocator.
75663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   The Pool Allocator provides support to use a ref counter
76663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   to detect a pool allocator is not needed anymore.
77436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   It is the caller responsibility to call VG_(addRefPA) for
78436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   each new reference to a pool and VG_(releasePA) when such a reference
79436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   disappears.
80436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   VG_(releasePA) will automatically call VG_(deletePA)
81436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov   to delete the PA when the ref counter drops to 0. */
82663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
83663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng// VG_(addRefPA) indicates there is a new reference to pa.
84663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengextern void VG_(addRefPA) ( PoolAlloc* pa);
85663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
86663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng// VG_(releasePA) decrements the pa reference count and deletes the pa if that
87663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng// reference count has dropped to zero. Returns the new value of the reference
88663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng// count.
89663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengextern UWord VG_(releasePA) ( PoolAlloc* pa);
90663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
91663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#endif   // __PUB_TOOL_POOLALLOC_
92663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
93663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/*--------------------------------------------------------------------*/
94663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/*--- end                                    pub_tool_poolalloc.h  ---*/
95663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng/*--------------------------------------------------------------------*/
96