/* src/mm/memory.h - macros for memory management
- Copyright (C) 1996-2005, 2006 R. Grafl, A. Krall, C. Kruegel,
+ 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
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301, USA.
- Contact: cacao@cacaojvm.org
-
- Authors: Reinhard Grafl
-
- Changes: Christian Thalinger
-
- $Id: memory.h 4840 2006-04-25 17:45:02Z edwin $
-
*/
/* 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 "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"
/*
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.
*/
-
-#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 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)))
-#if !defined(DISABLE_GC)
#define NEW(type) ((type *) mem_alloc(sizeof(type)))
#define FREE(ptr,type) mem_free((ptr), sizeof(type))
#define MREALLOC(ptr,type,num1,num2) mem_realloc((ptr), sizeof(type) * (num1), \
sizeof(type) * (num2))
-#else
-
-#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))
-
-#endif
#define DNEW(type) ((type *) dump_alloc(sizeof(type)))
#define DMNEW(type,num) ((type *) dump_alloc(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)
+#define CFREE(ptr,num) memory_cfree((ptr),(num))
/* GC macros ******************************************************************/
/* 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);