1 /************************* toolbox/memory.h ************************************
3 Copyright (c) 1997 A. Krall, R. Grafl, M. Gschwind, M. Probst
5 See file COPYRIGHT for information on usage and disclaimer of warranties
7 Headerfiles und Makros f"ur die Speicherverwaltung.
9 Authors: Reinhard Grafl EMAIL: cacao@complang.tuwien.ac.at
11 Last Change: 1996/10/03
13 *******************************************************************************/
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 ) )
22 #define NEW(type) ((type*) mem_alloc ( sizeof(type) ))
23 #define FREE(ptr,type) mem_free (ptr, sizeof(type) )
25 #define LNEW(type) ((type*) lit_mem_alloc ( sizeof(type) ))
26 #define LFREE(ptr,type) lit_mem_free (ptr, sizeof(type) )
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) )
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) )
38 #define MCOPY(dest,src,type,num) memcpy (dest,src, sizeof(type)* (num) )
41 #define CNEW(type,num) ((type*) mem_mmap ( sizeof(type) * (num) ))
42 #define CFREE(ptr,num)
44 #define CNEW(type,num) ((type*) mem_alloc ( sizeof(type) * (num) ))
45 #define CFREE(ptr,num) mem_free (ptr, num)
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);
56 void *dump_alloc(int length);
57 void *dump_realloc(void *m, int len1, int len2);
59 void dump_release(long int size);
61 void mem_usagelog(int givewarnings);
66 ---------------------------- Schnittstellenbeschreibung -----------------------
68 Der Speicherverwalter hat zwei m"ogliche Arten Speicher zu reservieren
71 1. explizites Anfordern / Freigeben
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
80 2. explizites Anfordern und automatisches Freigeben
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.
90 Es gibt f"ur diese Funktionen ein paar praktische Makros:
92 NEW (type) ....... legt Speicher f"ur ein Element des Typs `type` an.
93 FREE (ptr,type) .. gibt Speicher zur"uck
95 MNEW (type,num) .. legt Speicher f"ur ein ganzes Array an
96 MFREE (ptr,type,num) .. gibt den Speicher wieder her
98 MREALLOC (ptr,type,num1,num2) .. vergr"o"sert den Speicher f"ur das Array
101 Die meisten der Makros gibt es auch f"ur den DUMP-Speicher, na"mlich mit
102 gleichem Namen, nur mit vorangestelltem 'D', also:
104 DNEW, DMNEW, DMREALLOC (DFREE gibt es nat"urlich keines)
107 -------------------------------------------------------------------------------
109 Die restlichen Makros:
111 ALIGN (pos, size) ... Rundet den Wert von 'pos' auf die n"achste durch
112 'size' teilbare Zahl auf.
115 OFFSET (s,el) ....... Berechnet den Offset (in Bytes) des Elementes 'el'
118 MCOPY (dest,src,type,num) ... Kopiert 'num' Elemente vom Typ 'type'.