Fix mysterious unremovable file part 2 ?
[cacao.git] / src / mm / memory.h
1 /* src/mm/memory.h - macros for memory management
2
3    Copyright (C) 1996-2005, 2006, 2007, 2008
4    CACAOVM - Verein zur Foerderung der freien virtuellen Maschine CACAO
5
6    This file is part of CACAO.
7
8    This program is free software; you can redistribute it and/or
9    modify it under the terms of the GNU General Public License as
10    published by the Free Software Foundation; either version 2, or (at
11    your option) any later version.
12
13    This program is distributed in the hope that it will be useful, but
14    WITHOUT ANY WARRANTY; without even the implied warranty of
15    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16    General Public License for more details.
17
18    You should have received a copy of the GNU General Public License
19    along with this program; if not, write to the Free Software
20    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
21    02110-1301, USA.
22
23 */
24
25
26 #ifndef _MEMORY_H
27 #define _MEMORY_H
28
29
30 #include "config.h"
31
32 #include <string.h>
33
34 #include "vm/types.h"
35
36 #include "mm/codememory.h"
37 #include "mm/dumpmemory.h"
38
39
40 /* constants for ENABLE_MEMCHECK **********************************************/
41
42 #if defined(ENABLE_MEMCHECK)
43 #define MEMORY_CANARY_SIZE          16
44 #define MEMORY_CANARY_FIRST_BYTE    0xca
45 #define MEMORY_CLEAR_BYTE           0xa5
46 #endif /* defined(ENABLE_MEMCHECK) */
47
48
49 /* internal includes **********************************************************/
50
51 #include "mm/gc-common.h"
52
53
54 /* 
55 ---------------------------- Interface description -----------------------
56
57 There are two possible choices for allocating memory:
58
59         1.   explicit allocating / deallocating
60
61                         mem_alloc ..... allocate a memory block 
62                         mem_free ...... free a memory block
63                         mem_realloc ... change size of a memory block (position may change)
64                         mem_usage ..... amount of allocated memory
65
66 There are some useful macros:
67
68         NEW (type) ....... allocate memory for an element of type `type`
69         FREE (ptr,type) .. free memory
70         
71         MNEW (type,num) .. allocate memory for an array
72         MFREE (ptr,type,num) .. free memory
73         
74         MREALLOC (ptr,type,num1,num2) .. enlarge the array to size num2
75                                          
76 -------------------------------------------------------------------------------
77
78 Some more macros:
79
80         MEMORY_ALIGN (pos, size) ... make pos divisible by size. always returns an
81                                  address >= pos.
82                               
83         
84         OFFSET (s,el) ....... returns the offset of 'el' in structure 's' in bytes.
85                               
86         MCOPY (dest,src,type,num) ... copy 'num' elements of type 'type'.
87         
88
89 */
90
91 #define MEMORY_ALIGN(pos,size) ((((pos) + (size) - 1) / (size)) * (size))
92 #define PADDING(pos,size)     (MEMORY_ALIGN((pos),(size)) - (pos))
93 #define OFFSET(s,el)          ((int32_t) ((ptrint) &(((s*) 0)->el)))
94
95
96 #define NEW(type)             ((type *) mem_alloc(sizeof(type)))
97 #define FREE(ptr,type)        mem_free((ptr), sizeof(type))
98
99 #define MNEW(type,num)        ((type *) mem_alloc(sizeof(type) * (num)))
100 #define MFREE(ptr,type,num)   mem_free((ptr), sizeof(type) * (num))
101
102 #define MREALLOC(ptr,type,num1,num2) mem_realloc((ptr), sizeof(type) * (num1), \
103                                                         sizeof(type) * (num2))
104
105
106 #define MCOPY(dest,src,type,num) memcpy((dest), (src), sizeof(type) * (num))
107 #define MSET(ptr,byte,type,num) memset((ptr), (byte), sizeof(type) * (num))
108 #define MZERO(ptr,type,num)     MSET(ptr,0,type,num)
109 #define MMOVE(dest,src,type,num) memmove((dest), (src), sizeof(type) * (num))
110
111
112 /* GC macros (boehm only) *****************************************************/
113
114 #if defined(ENABLE_GC_BOEHM)
115
116 /* Uncollectable memory which can contain references */
117
118 #define GCNEW_UNCOLLECTABLE(type,num) ((type *) heap_alloc_uncollectable(sizeof(type) * (num)))
119
120 #define GCNEW(type)           heap_alloc(sizeof(type), true, NULL, true)
121 #define GCMNEW(type,num)      heap_alloc(sizeof(type) * (num), true, NULL, true)
122
123 #define GCFREE(ptr)           heap_free((ptr))
124
125 #endif
126
127
128 /* function prototypes ********************************************************/
129
130 bool  memory_init(void);
131
132 void  memory_mprotect(void *addr, size_t len, int prot);
133
134 void *memory_checked_alloc(size_t size);
135
136 void *memory_cnew(int32_t size);
137 void  memory_cfree(void *p, int32_t size);
138
139 void *mem_alloc(int32_t size);
140 void  mem_free(void *m, int32_t size);
141 void *mem_realloc(void *src, int32_t len1, int32_t len2);
142
143 #if defined(ENABLE_THREADS)
144 bool  memory_start_thread(void);
145 #endif
146
147 #endif /* _MEMORY_H */
148
149
150 /*
151  * These are local overrides for various environment variables in Emacs.
152  * Please do not remove this and leave it at the end of the file, where
153  * Emacs will automagically detect them.
154  * ---------------------------------------------------------------------
155  * Local variables:
156  * mode: c
157  * indent-tabs-mode: t
158  * c-basic-offset: 4
159  * tab-width: 4
160  * End:
161  * vim:noexpandtab:sw=4:ts=4:
162  */