X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=src%2Fmm%2Fmemory.h;h=f1710efea6ac2f675b02856a44fa0d4781befbed;hb=9f859ad50d3d5d98c185d40b86b2179bc4dc9aeb;hp=b6d750c4726abc896265136ed7ab3e0382ae9612;hpb=dee5bf9c7c68ae577b889e8fa6f02ba378a62477;p=cacao.git diff --git a/src/mm/memory.h b/src/mm/memory.h index b6d750c47..f1710efea 100644 --- a/src/mm/memory.h +++ b/src/mm/memory.h @@ -1,9 +1,9 @@ /* src/mm/memory.h - macros for memory management - Copyright (C) 1996-2005 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 + Copyright (C) 1996-2005, 2006, 2007 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,16 +19,8 @@ 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. - - Contact: cacao@complang.tuwien.ac.at - - Authors: Reinhard Grafl - - Changes: Christian Thalinger - - $Id: memory.h 3478 2005-10-21 13:07:58Z twisti $ + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301, USA. */ @@ -36,18 +28,67 @@ #ifndef _MEMORY_H #define _MEMORY_H -#include - /* forward typedefs ***********************************************************/ -typedef struct dumpblock dumpblock; -typedef struct dumpinfo dumpinfo; +typedef struct dumpblock_t dumpblock_t; +typedef struct dumpinfo_t dumpinfo_t; +#include "config.h" + +#include -#include "arch.h" #include "vm/types.h" -#include "mm/boehm.h" + +/* ATTENTION: We need to define dumpblock_t and dumpinfo_t before + internal includes, as we need dumpinfo_t as nested structure in + threadobject. */ + +/* dumpblock ******************************************************************/ + +#define DUMPBLOCKSIZE 2 << 13 /* 2 * 8192 bytes */ +#define ALIGNSIZE 8 + +struct dumpblock_t { + dumpblock_t *prev; + u1 *dumpmem; + s4 size; +}; + + +/* dump_allocation ************************************************************* + + This struct is used to record dump memory allocations for ENABLE_MEMCHECK. + +*******************************************************************************/ + +#if defined(ENABLE_MEMCHECK) +typedef struct dump_allocation_t dump_allocation_t; + +struct dump_allocation_t { + dump_allocation_t *next; + u1 *mem; + s4 useddumpsize; + s4 size; +}; +#endif + + +/* dumpinfo *******************************************************************/ + +struct dumpinfo_t { + dumpblock_t *currentdumpblock; /* the current top-most block */ + s4 allocateddumpsize; /* allocated bytes in this area */ + s4 useddumpsize; /* used bytes in this dump area */ +#if defined(ENABLE_MEMCHECK) + dump_allocation_t *allocations; /* list of allocations in this area */ +#endif +}; + + +/* internal includes **********************************************************/ + +#include "mm/gc-common.h" /* @@ -90,8 +131,8 @@ These macros do the same except they operate on the dump area: Some more macros: - ALIGN (pos, size) ... make pos divisible by size. always returns an - address >= pos. + MEMORY_ALIGN (pos, size) ... make pos divisible by size. always returns an + address >= pos. OFFSET (s,el) ....... returns the offset of 'el' in structure 's' in bytes. @@ -101,32 +142,9 @@ Some more macros: */ - -#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 MEMORY_ALIGN(pos,size) ((((pos) + (size) - 1) / (size)) * (size)) +#define PADDING(pos,size) (MEMORY_ALIGN((pos),(size)) - (pos)) +#define OFFSET(s,el) ((s4) ((ptrint) &(((s*) 0)->el))) #define NEW(type) ((type *) mem_alloc(sizeof(type))) @@ -134,9 +152,11 @@ struct dumpinfo { #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 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), \ @@ -144,10 +164,11 @@ struct dumpinfo { #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 MZERO(ptr,type,num) MSET(ptr,0,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) +#define CFREE(ptr,num) memory_cfree((ptr),(num)) /* GC macros ******************************************************************/ @@ -156,18 +177,30 @@ struct dumpinfo { #define GCNEW_UNCOLLECTABLE(type,num) ((type *) heap_alloc_uncollectable(sizeof(type) * (num))) -#define GCNEW(type,num) heap_allocate(sizeof(type) * (num), true, NULL) +#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_mmap_anon(void *addr, size_t len, int prot, int flags); + void *memory_cnew(s4 size); +void memory_cfree(void *p, s4 size); void *mem_alloc(s4 size); void mem_free(void *m, s4 size); void *mem_realloc(void *src, s4 len1, s4 len2); +#if defined(ENABLE_THREADS) +bool memory_start_thread(void); +#endif + void *dump_alloc(s4 size); void *dump_realloc(void *src, s4 len1, s4 len2); s4 dump_size(void);