1 /* Fixed-size block allocator.
2 Copyright (C) 1994 Free Software Foundation, Inc.
4 This file is part of XEmacs.
6 XEmacs is free software; you can redistribute it and/or modify it
7 under the terms of the GNU General Public License as published by the
8 Free Software Foundation; either version 2, or (at your option) any
11 XEmacs is distributed in the hope that it will be useful, but WITHOUT
12 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
16 You should have received a copy of the GNU General Public License
17 along with XEmacs; see the file COPYING. If not, write to
18 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19 Boston, MA 02111-1307, USA.
22 /* Synched up with: Not in FSF. */
26 Ben Wing: December 1994, for 19.12.
31 ------------------------------------------------------------------------------
33 A "block-type object" is used to efficiently allocate and free blocks
34 of a particular size. Freed blocks are remembered in a free list and
35 are reused as necessary to allocate new blocks, so as to avoid as
36 much as possible making calls to malloc() and free().
38 This is a container object. Declare a block-type object of a specific type
41 struct mytype_blocktype {
42 Blocktype_declare (mytype);
45 Use the following functions/macros:
47 structype *Blocktype_new(structype)
48 [MACRO] Create a new block-type object of the specified type.
49 The argument to this call should be the type of object to be
50 created, e.g. foobar_blocktype.
51 type *Blocktype_alloc(b)
52 [MACRO] Allocate a block of the proper type for the specified
53 block-type object and return a pointer to it.
54 Blocktype_free(b, block)
55 Free a block of the type corresponding to the specified block-type
58 Destroy a block-type object and the memory allocated to it.
62 /* This file has been Mule-ized. */
67 #include "blocktype.h"
69 typedef struct blocktype
71 Blocktype_declare (void);
80 Blocktype_newf (size_t elsize)
82 Blocktype *b = xnew (Blocktype);
83 b->elsize = max (elsize, sizeof (void *));
89 Blocktype_allocf (void *bbb)
91 Blocktype *b = (Blocktype *) bbb;
95 b->free = ((struct block_internal *) (b->free))->next;
98 b->tempel = (void *) xmalloc (b->elsize);
102 Blocktype_free (void *bbb, void *el)
104 Blocktype *b = (Blocktype *) bbb;
105 ((struct block_internal *) el)->next = b->free;