428
+ − 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 *
665
+ − 80 Blocktype_newf (Bytecount elsize)
428
+ − 81 {
+ − 82 Blocktype *b = xnew (Blocktype);
665
+ − 83 b->elsize = max (elsize, (Bytecount) sizeof (void *));
428
+ − 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 }