|
1.1
|
(niklas 29-May-97) |
1 |
: /* objalloc.h -- routines to allocate memory for objects
|
|
|
|
2 |
: Copyright 1997 Free Software Foundation, Inc.
|
|
|
|
3 |
: Written by Ian Lance Taylor, Cygnus Solutions.
|
|
|
|
4 |
:
|
|
|
|
5 |
: This program is free software; you can redistribute it and/or modify it
|
|
|
|
6 |
: under the terms of the GNU General Public License as published by the
|
|
|
|
7 |
: Free Software Foundation; either version 2, or (at your option) any
|
|
|
|
8 |
: later version.
|
|
|
|
9 |
:
|
|
|
|
10 |
: This program is distributed in the hope that it will be useful,
|
|
|
|
11 |
: but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
12 |
: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
13 |
: GNU General Public License for more details.
|
|
|
|
14 |
:
|
|
|
|
15 |
: You should have received a copy of the GNU General Public License
|
|
|
|
16 |
: along with this program; if not, write to the Free Software
|
|
1.1.1.2
|
(espie 12-Sep-00) |
17 |
: Foundation, 59 Temple Place - Suite 330,
|
|
|
|
18 |
: Boston, MA 02111-1307, USA. */
|
|
1.1
|
(niklas 29-May-97) |
19 |
:
|
|
|
|
20 |
: #ifndef OBJALLOC_H
|
|
|
|
21 |
: #define OBJALLOC_H
|
|
|
|
22 |
:
|
|
|
|
23 |
: #include "ansidecl.h"
|
|
|
|
24 |
:
|
|
|
|
25 |
: /* These routines allocate space for an object. The assumption is
|
|
|
|
26 |
: that the object will want to allocate space as it goes along, but
|
|
|
|
27 |
: will never want to free any particular block. There is a function
|
|
|
|
28 |
: to free a block, which also frees all more recently allocated
|
|
|
|
29 |
: blocks. There is also a function to free all the allocated space.
|
|
|
|
30 |
:
|
|
|
|
31 |
: This is essentially a specialization of obstacks. The main
|
|
|
|
32 |
: difference is that a block may not be allocated a bit at a time.
|
|
|
|
33 |
: Another difference is that these routines are always built on top
|
|
|
|
34 |
: of malloc, and always pass an malloc failure back to the caller,
|
|
|
|
35 |
: unlike more recent versions of obstacks. */
|
|
|
|
36 |
:
|
|
|
|
37 |
: /* This is what an objalloc structure looks like. Callers should not
|
|
|
|
38 |
: refer to these fields, nor should they allocate these structure
|
|
|
|
39 |
: themselves. Instead, they should only create them via
|
|
|
|
40 |
: objalloc_init, and only access them via the functions and macros
|
|
|
|
41 |
: listed below. The structure is only defined here so that we can
|
|
|
|
42 |
: access it via macros. */
|
|
|
|
43 |
:
|
|
|
|
44 |
: struct objalloc
|
|
|
|
45 |
: {
|
|
|
|
46 |
: char *current_ptr;
|
|
|
|
47 |
: unsigned int current_space;
|
|
|
|
48 |
: PTR chunks;
|
|
|
|
49 |
: };
|
|
|
|
50 |
:
|
|
|
|
51 |
: /* Work out the required alignment. */
|
|
|
|
52 |
:
|
|
|
|
53 |
: struct objalloc_align { char x; double d; };
|
|
|
|
54 |
:
|
|
|
|
55 |
: #if defined (__STDC__) && __STDC__
|
|
|
|
56 |
: #ifndef offsetof
|
|
|
|
57 |
: #include <stddef.h>
|
|
|
|
58 |
: #endif
|
|
|
|
59 |
: #define OBJALLOC_ALIGN \
|
|
|
|
60 |
: ((ptrdiff_t) ((char *) &((struct objalloc_align *) 0)->d - (char *) 0))
|
|
|
|
61 |
: #else
|
|
|
|
62 |
: #define OBJALLOC_ALIGN \
|
|
|
|
63 |
: ((long) ((char *) &((struct objalloc_align *) 0)->d - (char *) 0))
|
|
|
|
64 |
: #endif
|
|
|
|
65 |
:
|
|
|
|
66 |
: /* Create an objalloc structure. Returns NULL if malloc fails. */
|
|
|
|
67 |
:
|
|
|
|
68 |
: extern struct objalloc *objalloc_create PARAMS ((void));
|
|
|
|
69 |
:
|
|
|
|
70 |
: /* Allocate space from an objalloc structure. Returns NULL if malloc
|
|
|
|
71 |
: fails. */
|
|
|
|
72 |
:
|
|
|
|
73 |
: extern PTR _objalloc_alloc PARAMS ((struct objalloc *, unsigned long));
|
|
|
|
74 |
:
|
|
|
|
75 |
: /* The macro version of objalloc_alloc. We only define this if using
|
|
|
|
76 |
: gcc, because otherwise we would have to evaluate the arguments
|
|
|
|
77 |
: multiple times, or use a temporary field as obstack.h does. */
|
|
|
|
78 |
:
|
|
|
|
79 |
: #if defined (__GNUC__) && defined (__STDC__) && __STDC__
|
|
|
|
80 |
:
|
|
|
|
81 |
: /* NextStep 2.0 cc is really gcc 1.93 but it defines __GNUC__ = 2 and
|
|
|
|
82 |
: does not implement __extension__. But that compiler doesn't define
|
|
|
|
83 |
: __GNUC_MINOR__. */
|
|
|
|
84 |
: #if __GNUC__ < 2 || (__NeXT__ && !__GNUC_MINOR__)
|
|
|
|
85 |
: #define __extension__
|
|
|
|
86 |
: #endif
|
|
|
|
87 |
:
|
|
|
|
88 |
: #define objalloc_alloc(o, l) \
|
|
|
|
89 |
: __extension__ \
|
|
|
|
90 |
: ({ struct objalloc *__o = (o); \
|
|
|
|
91 |
: unsigned long __len = (l); \
|
|
|
|
92 |
: if (__len == 0) \
|
|
|
|
93 |
: __len = 1; \
|
|
|
|
94 |
: __len = (__len + OBJALLOC_ALIGN - 1) &~ (OBJALLOC_ALIGN - 1); \
|
|
|
|
95 |
: (__len <= __o->current_space \
|
|
|
|
96 |
: ? (__o->current_ptr += __len, \
|
|
|
|
97 |
: __o->current_space -= __len, \
|
|
|
|
98 |
: (PTR) (__o->current_ptr - __len)) \
|
|
|
|
99 |
: : _objalloc_alloc (__o, __len)); })
|
|
|
|
100 |
:
|
|
|
|
101 |
: #else /* ! __GNUC__ */
|
|
|
|
102 |
:
|
|
|
|
103 |
: #define objalloc_alloc(o, l) _objalloc_alloc ((o), (l))
|
|
|
|
104 |
:
|
|
|
|
105 |
: #endif /* ! __GNUC__ */
|
|
|
|
106 |
:
|
|
|
|
107 |
: /* Free an entire objalloc structure. */
|
|
|
|
108 |
:
|
|
|
|
109 |
: extern void objalloc_free PARAMS ((struct objalloc *));
|
|
|
|
110 |
:
|
|
|
|
111 |
: /* Free a block allocated by objalloc_alloc. This also frees all more
|
|
|
|
112 |
: recently allocated blocks. */
|
|
|
|
113 |
:
|
|
|
|
114 |
: extern void objalloc_free_block PARAMS ((struct objalloc *, PTR));
|
|
|
|
115 |
:
|
|
|
|
116 |
: #endif /* OBJALLOC_H */
|