XEmacs 21.2-b1
[chise/xemacs-chise.git.1] / src / blocktype.c
1 /* Fixed-size block allocator.
2    Copyright (C) 1994 Free Software Foundation, Inc.
3
4 This file is part of XEmacs.
5
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
9 later version.
10
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
14 for more details.
15
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.
20 */
21
22 /* Synched up with: Not in FSF. */
23
24 /* Authorship:
25
26    Ben Wing: December 1994, for 19.12.
27  */
28
29 /*
30
31 ------------------------------------------------------------------------------
32
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().
37
38 This is a container object.  Declare a block-type object of a specific type
39 as follows:
40
41 struct mytype_blocktype {
42   Blocktype_declare (mytype);
43 };
44
45 Use the following functions/macros:
46
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
56       object.
57    Blocktype_delete(b)
58       Destroy a block-type object and the memory allocated to it.
59
60 */
61
62 /* This file has been Mule-ized. */
63
64 #include <config.h>
65 #include "lisp.h"
66
67 #include "blocktype.h"
68
69 typedef struct blocktype
70 {
71   Blocktype_declare (void);
72 } Blocktype;
73
74 struct block_internal
75 {
76   void *next;
77 };
78
79 void *
80 Blocktype_newf (size_t elsize)
81 {
82   Blocktype *b = xnew (Blocktype);
83   b->elsize = max (elsize, sizeof (void *));
84   b->free = 0;
85   return (void *) b;
86 }
87
88 void
89 Blocktype_allocf (void *bbb)
90 {
91   Blocktype *b = (Blocktype *) bbb;
92   if (b->free)
93     {
94       b->tempel = b->free;
95       b->free = ((struct block_internal *) (b->free))->next;
96     }
97   else
98     b->tempel = (void *) xmalloc (b->elsize);
99 }
100
101 void
102 Blocktype_free (void *bbb, void *el)
103 {
104   Blocktype *b = (Blocktype *) bbb;
105   ((struct block_internal *) el)->next = b->free;
106   b->free = el;
107 }