X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=src%2Fmm%2Fmemory.h;h=f909e33756bd909242db44283bce4da72f30a49e;hb=7eb9565b4da854fc6ced7220cb19040df0033573;hp=bfa9bc79f73601ea76995dca1be6a05bb67bf242;hpb=4e4bb1f75a1ade68ccc44ab43db400b4b59a3329;p=cacao.git diff --git a/src/mm/memory.h b/src/mm/memory.h index bfa9bc79f..f909e3375 100644 --- a/src/mm/memory.h +++ b/src/mm/memory.h @@ -1,9 +1,9 @@ -/* toolbox/memory.h - macros for memory management +/* src/mm/memory.h - macros for memory management - Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003 - R. Grafl, A. Krall, C. Kruegel, C. Oates, R. Obermaisser, - M. Probst, S. Ring, E. Steiner, C. Thalinger, D. Thuernbeck, - P. Tomsich, J. Wenninger + Copyright (C) 1996-2005, 2006 R. Grafl, A. Krall, C. Kruegel, + C. Oates, R. Obermaisser, M. Platter, M. Probst, S. Ring, + E. Steiner, C. Thalinger, D. Thuernbeck, P. Tomsich, C. Ullrich, + J. Wenninger, Institut f. Computersprachen - TU Wien This file is part of CACAO. @@ -19,14 +19,16 @@ You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA - 02111-1307, USA. + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301, USA. - Contact: cacao@complang.tuwien.ac.at + Contact: cacao@cacaojvm.org Authors: Reinhard Grafl - $Id: memory.h 739 2003-12-13 18:52:21Z stefan $ + Changes: Christian Thalinger + + $Id: memory.h 4438 2006-02-05 00:16:54Z twisti $ */ @@ -34,7 +36,19 @@ #ifndef _MEMORY_H #define _MEMORY_H -#include "types.h" +/* forward typedefs ***********************************************************/ + +typedef struct dumpblock dumpblock; +typedef struct dumpinfo dumpinfo; + +#include "config.h" + +#include + +#include "vm/types.h" + +#include "mm/boehm.h" + /* ---------------------------- Interface description ----------------------- @@ -87,59 +101,98 @@ Some more macros: */ -/* Uncollectable memory which can contain references */ -void *heap_alloc_uncollectable(u4 bytelen); -void heap_free(void *); -#define GCNEW(type,num) heap_alloc_uncollectable(sizeof(type) * (num)) -#define GCFREE(ptr) heap_free(ptr) + +#define DUMPBLOCKSIZE 2 << 13 /* 2 * 8192 bytes */ +#define ALIGNSIZE 8 + + +/* dumpblock ******************************************************************/ + +struct dumpblock { + dumpblock *prev; + u1 *dumpmem; + s4 size; +}; + + +/* dumpinfo *******************************************************************/ + +struct dumpinfo { + dumpblock *currentdumpblock; + s4 allocateddumpsize; + s4 useddumpsize; +}; + #define ALIGN(pos,size) ((((pos) + (size) - 1) / (size)) * (size)) #define PADDING(pos,size) (ALIGN((pos),(size)) - (pos)) -#define OFFSET(s,el) ((int) ((size_t) & (((s*) 0)->el))) +#define OFFSET(s,el) ((s4) ((ptrint) &(((s*) 0)->el))) +#if !defined(DISABLE_GC) -#define NEW(type) ((type*) mem_alloc(sizeof(type))) -#define FREE(ptr,type) mem_free(ptr, sizeof(type)) +#define NEW(type) ((type *) mem_alloc(sizeof(type))) +#define FREE(ptr,type) mem_free((ptr), sizeof(type)) -#define LNEW(type) ((type*) lit_mem_alloc(sizeof(type))) -#define LFREE(ptr,type) lit_mem_free(ptr, sizeof(type)) +#define MNEW(type,num) ((type *) mem_alloc(sizeof(type) * (num))) +#define MFREE(ptr,type,num) mem_free((ptr), sizeof(type) * (num)) -#define MNEW(type,num) ((type*) mem_alloc(sizeof(type) * (num))) -#define MFREE(ptr,type,num) mem_free(ptr, sizeof(type) * (num)) -#define MREALLOC(ptr,type,num1,num2) mem_realloc(ptr, sizeof(type) * (num1), \ - sizeof(type) * (num2)) +#define MREALLOC(ptr,type,num1,num2) mem_realloc((ptr), sizeof(type) * (num1), \ + sizeof(type) * (num2)) -#define DNEW(type) ((type*) dump_alloc(sizeof(type))) -#define DMNEW(type,num) ((type*) dump_alloc(sizeof(type) * (num))) -#define DMREALLOC(ptr,type,num1,num2) dump_realloc(ptr, sizeof(type) * (num1),\ - sizeof(type) * (num2)) +#else -#define MCOPY(dest,src,type,num) memcpy(dest,src, sizeof(type)* (num)) +#define NEW(type) GCNEW(type) +#define FREE(ptr,type) GCFREE(ptr) + +#define MNEW(type,num) GCMNEW(type,num) +#define MFREE(ptr,type,num) GCFREE(ptr) + +#define MREALLOC(ptr,type,num1,num2) nogc_realloc((ptr), sizeof(type) * (num1), \ + sizeof(type) * (num2)) -#ifdef USE_CODEMMAP -#define CNEW(type,num) ((type*) mem_mmap( sizeof(type) * (num))) -#define CFREE(ptr,num) -#else -#define CNEW(type,num) ((type*) mem_alloc(sizeof(type) * (num))) -#define CFREE(ptr,num) mem_free(ptr, num) #endif +#define DNEW(type) ((type *) dump_alloc(sizeof(type))) +#define DMNEW(type,num) ((type *) dump_alloc(sizeof(type) * (num))) +#define DMREALLOC(ptr,type,num1,num2) dump_realloc((ptr), sizeof(type) * (num1), \ + sizeof(type) * (num2)) + +#define MCOPY(dest,src,type,num) memcpy((dest), (src), sizeof(type) * (num)) +#define MSET(ptr,byte,type,num) memset((ptr), (byte), sizeof(type) * (num)) +#define MMOVE(dest,src,type,num) memmove((dest), (src), sizeof(type) * (num)) + +#define CNEW(type,num) ((type *) memory_cnew(sizeof(type) * (num))) +#define CFREE(ptr,num) MFREE(ptr,u1,num) + + +/* GC macros ******************************************************************/ + +/* Uncollectable memory which can contain references */ + +#define GCNEW_UNCOLLECTABLE(type,num) ((type *) heap_alloc_uncollectable(sizeof(type) * (num))) + +#define GCNEW(type) heap_allocate(sizeof(type), true, NULL) +#define GCMNEW(type,num) heap_allocate(sizeof(type) * (num), true, NULL) + +#define GCFREE(ptr) heap_free((ptr)) + + +/* function prototypes ********************************************************/ + +/* initializes the memory subsystem */ +bool memory_init(void); + +void *memory_cnew(s4 size); -void *mem_alloc(int length); -void *mem_mmap(int length); -void *lit_mem_alloc(int length); -void mem_free(void *m, int length); -void lit_mem_free(void *m, int length); -void *mem_realloc(void *m, int len1, int len2); -long int mem_usage(); +void *mem_alloc(s4 size); +void mem_free(void *m, s4 size); +void *mem_realloc(void *src, s4 len1, s4 len2); -void *dump_alloc(int length); -void *dump_realloc(void *m, int len1, int len2); -long int dump_size(); -void dump_release(long int size); +void *dump_alloc(s4 size); +void *dump_realloc(void *src, s4 len1, s4 len2); +s4 dump_size(void); +void dump_release(s4 size); -void mem_usagelog(int givewarnings); - #endif /* _MEMORY_H */