Code restructuring.
[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 575 2003-11-09 17:26:53Z twisti $
30
31 */
32
33
34 #ifndef _MEMORY_H
35 #define _MEMORY_H
36
37 #include "types.h"
38
39 /* 
40 ---------------------------- Interface description -----------------------
41
42 There are two possible choices for allocating memory:
43
44         1.   explicit allocating / deallocating
45
46                         mem_alloc ..... allocate a memory block 
47                         mem_free ...... free a memory block
48                         mem_realloc ... change size of a memory block (position may change)
49                         mem_usage ..... amount of allocated memory
50
51
52         2.   explicit allocating, automatic deallocating
53         
54                         dump_alloc .... allocate a memory block in the dump area
55                         dump_realloc .. change size of a memory block (position may change)
56                         dump_size ..... marks the current top of dump
57                         dump_release .. free all memory requested after the mark
58                                         
59         
60 There are some useful macros:
61
62         NEW (type) ....... allocate memory for an element of type `type`
63         FREE (ptr,type) .. free memory
64         
65         MNEW (type,num) .. allocate memory for an array
66         MFREE (ptr,type,num) .. free memory
67         
68         MREALLOC (ptr,type,num1,num2) .. enlarge the array to size num2
69                                          
70 These macros do the same except they operate on the dump area:
71         
72         DNEW,  DMNEW, DMREALLOC   (there is no DFREE)
73
74
75 -------------------------------------------------------------------------------
76
77 Some more macros:
78
79         ALIGN (pos, size) ... make pos divisible by size. always returns an
80                                                   address >= pos.
81                               
82         
83         OFFSET (s,el) ....... returns the offset of 'el' in structure 's' in bytes.
84                               
85         MCOPY (dest,src,type,num) ... copy 'num' elements of type 'type'.
86         
87
88 */
89
90 /* Uncollectable memory which can contain references */
91 void *heap_alloc_uncollectable(u4 bytelen);
92 #define GCNEW(type,num)       heap_alloc_uncollectable(sizeof(type) * (num))
93
94 #define ALIGN(pos,size)       ((((pos) + (size) - 1) / (size)) * (size))
95 #define PADDING(pos,size)     (ALIGN((pos),(size)) - (pos))
96 #define OFFSET(s,el)          ((int) ((size_t) & (((s*) 0)->el)))
97
98
99 #define NEW(type)             ((type*) mem_alloc(sizeof(type)))
100 #define FREE(ptr,type)        mem_free(ptr, sizeof(type))
101
102 #define LNEW(type)            ((type*) lit_mem_alloc(sizeof(type)))
103 #define LFREE(ptr,type)       lit_mem_free(ptr, sizeof(type))
104
105 #define MNEW(type,num)        ((type*) mem_alloc(sizeof(type) * (num)))
106 #define MFREE(ptr,type,num)   mem_free(ptr, sizeof(type) * (num))
107 #define MREALLOC(ptr,type,num1,num2) mem_realloc(ptr, sizeof(type) * (num1), \
108                                                       sizeof(type) * (num2))
109
110 #define DNEW(type)            ((type*) dump_alloc(sizeof(type)))
111 #define DMNEW(type,num)       ((type*) dump_alloc(sizeof(type) * (num)))
112 #define DMREALLOC(ptr,type,num1,num2)  dump_realloc(ptr, sizeof(type) * (num1),\
113                                                          sizeof(type) * (num2))
114
115 #define MCOPY(dest,src,type,num)  memcpy(dest,src, sizeof(type)* (num))
116
117 #ifdef USE_CODEMMAP
118 #define CNEW(type,num)        ((type*) mem_mmap( sizeof(type) * (num)))
119 #define CFREE(ptr,num)
120 #else
121 #define CNEW(type,num)        ((type*) mem_alloc(sizeof(type) * (num)))
122 #define CFREE(ptr,num)        mem_free(ptr, num)
123 #endif
124
125
126 void *mem_alloc(int length);
127 void *mem_mmap(int length);
128 void *lit_mem_alloc(int length);
129 void mem_free(void *m, int length);
130 void lit_mem_free(void *m, int length);
131 void *mem_realloc(void *m, int len1, int len2);
132 long int mem_usage();
133
134 void *dump_alloc(int length);
135 void *dump_realloc(void *m, int len1, int len2);
136 long int dump_size();
137 void dump_release(long int size);
138
139 void mem_usagelog(int givewarnings);
140  
141 #endif /* _MEMORY_H */
142
143
144 /*
145  * These are local overrides for various environment variables in Emacs.
146  * Please do not remove this and leave it at the end of the file, where
147  * Emacs will automagically detect them.
148  * ---------------------------------------------------------------------
149  * Local variables:
150  * mode: c
151  * indent-tabs-mode: t
152  * c-basic-offset: 4
153  * tab-width: 4
154  * End:
155  */