- typecast GCNEW
[cacao.git] / src / mm / memory.h
1 /* toolbox/memory.h - macros for memory management
2
3    Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003
4    R. Grafl, A. Krall, C. Kruegel, C. Oates, R. Obermaisser,
5    M. Probst, S. Ring, E. Steiner, C. Thalinger, D. Thuernbeck,
6    P. Tomsich, J. Wenninger
7
8    This file is part of CACAO.
9
10    This program is free software; you can redistribute it and/or
11    modify it under the terms of the GNU General Public License as
12    published by the Free Software Foundation; either version 2, or (at
13    your option) any later version.
14
15    This program is distributed in the hope that it will be useful, but
16    WITHOUT ANY WARRANTY; without even the implied warranty of
17    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
18    General Public License for more details.
19
20    You should have received a copy of the GNU General Public License
21    along with this program; if not, write to the Free Software
22    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
23    02111-1307, USA.
24
25    Contact: cacao@complang.tuwien.ac.at
26
27    Authors: Reinhard Grafl
28
29    $Id: memory.h 1637 2004-12-01 10:33:25Z twisti $
30
31 */
32
33
34 #ifndef _MEMORY_H
35 #define _MEMORY_H
36
37 #include "arch.h"
38 #include "types.h"
39
40
41 /* 
42 ---------------------------- Interface description -----------------------
43
44 There are two possible choices for allocating memory:
45
46         1.   explicit allocating / deallocating
47
48                         mem_alloc ..... allocate a memory block 
49                         mem_free ...... free a memory block
50                         mem_realloc ... change size of a memory block (position may change)
51                         mem_usage ..... amount of allocated memory
52
53
54         2.   explicit allocating, automatic deallocating
55         
56                         dump_alloc .... allocate a memory block in the dump area
57                         dump_realloc .. change size of a memory block (position may change)
58                         dump_size ..... marks the current top of dump
59                         dump_release .. free all memory requested after the mark
60                                         
61         
62 There are some useful macros:
63
64         NEW (type) ....... allocate memory for an element of type `type`
65         FREE (ptr,type) .. free memory
66         
67         MNEW (type,num) .. allocate memory for an array
68         MFREE (ptr,type,num) .. free memory
69         
70         MREALLOC (ptr,type,num1,num2) .. enlarge the array to size num2
71                                          
72 These macros do the same except they operate on the dump area:
73         
74         DNEW,  DMNEW, DMREALLOC   (there is no DFREE)
75
76
77 -------------------------------------------------------------------------------
78
79 Some more macros:
80
81         ALIGN (pos, size) ... make pos divisible by size. always returns an
82                                                   address >= pos.
83                               
84         
85         OFFSET (s,el) ....... returns the offset of 'el' in structure 's' in bytes.
86                               
87         MCOPY (dest,src,type,num) ... copy 'num' elements of type 'type'.
88         
89
90 */
91
92
93 #define DUMPBLOCKSIZE    2 << 13    /* 2 * 8192 bytes */
94 #define ALIGNSIZE        8
95
96
97 /* dumpblock *******************************************************************
98
99    TODO
100
101 *******************************************************************************/
102
103 typedef struct dumpblock dumpblock;
104
105 struct dumpblock {
106         dumpblock *prev;
107         u1        *dumpmem;
108         s4         size;
109 };
110
111
112 /* dumpinfo ********************************************************************
113
114    DOCUMENT ME!
115
116 *******************************************************************************/
117
118 typedef struct dumpinfo dumpinfo;
119
120 struct dumpinfo {
121         dumpblock *currentdumpblock;
122         s4         allocateddumpsize;
123         s4         useddumpsize;
124 };
125
126
127 /* Uncollectable memory which can contain references */
128
129 #define GCNEW(type,num)       ((type *) heap_alloc_uncollectable(sizeof(type) * (num)))
130 #define GCFREE(ptr)           heap_free((ptr))
131
132 #define ALIGN(pos,size)       ((((pos) + (size) - 1) / (size)) * (size))
133 #define PADDING(pos,size)     (ALIGN((pos),(size)) - (pos))
134 #define OFFSET(s,el)          ((int) ((size_t) & (((s*) 0)->el)))
135
136
137 #define NEW(type)             ((type *) mem_alloc(sizeof(type)))
138 #define FREE(ptr,type)        mem_free((ptr), sizeof(type))
139
140 #define MNEW(type,num)        ((type *) mem_alloc(sizeof(type) * (num)))
141 #define MFREE(ptr,type,num)   mem_free((ptr), sizeof(type) * (num))
142 #define MREALLOC(ptr,type,num1,num2) mem_realloc((ptr), sizeof(type) * (num1), \
143                                                         sizeof(type) * (num2))
144
145 #define DNEW(type)            ((type *) dump_alloc(sizeof(type)))
146 #define DMNEW(type,num)       ((type *) dump_alloc(sizeof(type) * (num)))
147 #define DMREALLOC(ptr,type,num1,num2) dump_realloc((ptr), sizeof(type) * (num1), \
148                                                           sizeof(type) * (num2))
149
150 #define MCOPY(dest,src,type,num) memcpy((dest), (src), sizeof(type) * (num))
151 #define MSET(ptr,byte,type,num) memset((ptr), (byte), sizeof(type) * (num))
152
153 #if defined(USE_CODEMMAP)
154 #define CNEW(type,num)        ((type *) mem_mmap(sizeof(type) * (num)))
155 #define CFREE(ptr,num)        /* nothing */
156 #else
157 #define CNEW(type,num)        ((type *) mem_alloc(sizeof(type) * (num)))
158 #define CFREE(ptr,num)        mem_free((ptr), (num))
159 #endif
160
161
162 /* function prototypes ********************************************************/
163
164 void *mem_mmap(s4 size);
165 void *mem_alloc(s4 size);
166 void  mem_free(void *m, s4 size);
167 void *mem_realloc(void *src, s4 len1, s4 len2);
168
169 void *dump_alloc(s4 size);
170 void *dump_realloc(void *src, s4 len1, s4 len2);
171 s4    dump_size();
172 void  dump_release(s4 size);
173
174 #endif /* _MEMORY_H */
175
176
177 /*
178  * These are local overrides for various environment variables in Emacs.
179  * Please do not remove this and leave it at the end of the file, where
180  * Emacs will automagically detect them.
181  * ---------------------------------------------------------------------
182  * Local variables:
183  * mode: c
184  * indent-tabs-mode: t
185  * c-basic-offset: 4
186  * tab-width: 4
187  * End:
188  */