Initial revision
[cacao.git] / toolbox / memory.h
1 /************************* toolbox/memory.h ************************************
2
3         Copyright (c) 1997 A. Krall, R. Grafl, M. Gschwind, M. Probst
4
5         See file COPYRIGHT for information on usage and disclaimer of warranties
6
7         Headerfiles und Makros f"ur die Speicherverwaltung.
8
9         Authors: Reinhard Grafl      EMAIL: cacao@complang.tuwien.ac.at
10
11         Last Change: 1996/10/03
12
13 *******************************************************************************/
14
15 #define CODEMMAP
16
17 #define ALIGN(pos,size)       ( ( ((pos)+(size)-1) / (size))*(size) )
18 #define PADDING(pos,size)     ( ALIGN((pos),(size)) - (pos) )
19 #define OFFSET(s,el)          ( (int) &( ((s*)0) -> el ) )
20
21
22 #define NEW(type)             ((type*) mem_alloc ( sizeof(type) ))
23 #define FREE(ptr,type)        mem_free (ptr, sizeof(type) )
24
25 #define LNEW(type)             ((type*) lit_mem_alloc ( sizeof(type) ))
26 #define LFREE(ptr,type)        lit_mem_free (ptr, sizeof(type) )
27
28 #define MNEW(type,num)        ((type*) mem_alloc ( sizeof(type) * (num) ))
29 #define MFREE(ptr,type,num)   mem_free (ptr, sizeof(type) * (num) )
30 #define MREALLOC(ptr,type,num1,num2) mem_realloc (ptr, sizeof(type) * (num1), \
31                                                        sizeof(type) * (num2) )
32
33 #define DNEW(type)            ((type*) dump_alloc ( sizeof(type) ))
34 #define DMNEW(type,num)       ((type*) dump_alloc ( sizeof(type) * (num) ))
35 #define DMREALLOC(ptr,type,num1,num2)  dump_realloc (ptr, sizeof(type)*(num1),\
36                                                        sizeof(type) * (num2) )
37
38 #define MCOPY(dest,src,type,num)  memcpy (dest,src, sizeof(type)* (num) )
39
40 #ifdef CODEMMAP
41 #define CNEW(type,num)        ((type*) mem_mmap ( sizeof(type) * (num) ))
42 #define CFREE(ptr,num)
43 #else
44 #define CNEW(type,num)        ((type*) mem_alloc ( sizeof(type) * (num) ))
45 #define CFREE(ptr,num)        mem_free (ptr, num)
46 #endif
47
48 void *mem_alloc(int length);
49 void *mem_mmap(int length);
50 void *lit_mem_alloc(int length);
51 void mem_free(void *m, int length);
52 void lit_mem_free(void *m, int length);
53 void *mem_realloc(void *m, int len1, int len2);
54 long int mem_usage();
55
56 void *dump_alloc(int length);
57 void *dump_realloc(void *m, int len1, int len2);
58 long int dump_size();
59 void dump_release(long int size);
60
61 void mem_usagelog(int givewarnings);
62  
63  
64  
65 /* 
66 ---------------------------- Schnittstellenbeschreibung -----------------------
67
68 Der Speicherverwalter hat zwei m"ogliche Arten Speicher zu reservieren
69 und freizugeben:
70
71         1.   explizites Anfordern / Freigeben
72
73                         mem_alloc ..... Anfordern eines Speicherblocks 
74                         mem_free ...... Freigeben eines Speicherblocks
75                         mem_realloc ... Vergr"o"sern eines Speicherblocks (wobei 
76                                         der Inhalt eventuell an eine neue Position kommt)
77                         mem_usage ..... Menge des bereits belegten Speichers
78
79
80         2.   explizites Anfordern und automatisches Freigeben
81         
82                         dump_alloc .... Anfordern eines Speicherblocks vom
83                                         (wie ich es nenne) DUMP-Speicher
84                         dump_realloc .. Vergr"o"sern eines Speicherblocks
85                         dump_size ..... Merkt sich eine Freigabemarke am Dump
86                         dump_release .. Gibt allen Speicher, der nach der Marke angelegt 
87                                         worden ist, wieder frei.
88                                         
89         
90 Es gibt f"ur diese Funktionen ein paar praktische Makros:
91
92         NEW (type) ....... legt Speicher f"ur ein Element des Typs `type` an.
93         FREE (ptr,type) .. gibt Speicher zur"uck
94         
95         MNEW (type,num) .. legt Speicher f"ur ein ganzes Array an
96         MFREE (ptr,type,num) .. gibt den Speicher wieder her
97         
98         MREALLOC (ptr,type,num1,num2) .. vergr"o"sert den Speicher f"ur das Array
99                                          auf die Gr"o"se num2
100                                          
101 Die meisten der Makros gibt es auch f"ur den DUMP-Speicher, na"mlich mit
102 gleichem Namen, nur mit vorangestelltem 'D', also:      
103         
104         DNEW,  DMNEW, DMREALLOC   (DFREE gibt es nat"urlich keines)
105
106
107 -------------------------------------------------------------------------------
108
109 Die restlichen Makros:
110
111         ALIGN (pos, size) ... Rundet den Wert von 'pos' auf die n"achste durch
112                               'size' teilbare Zahl auf.
113                               
114         
115         OFFSET (s,el) ....... Berechnet den Offset (in Bytes) des Elementes 'el'   
116                               in der Struktur 's'.
117                               
118         MCOPY (dest,src,type,num) ... Kopiert 'num' Elemente vom Typ 'type'.
119         
120
121 */