* Removed all Id tags.
[cacao.git] / src / mm / memory.h
index 07708c989d649c48aca5191c2bd883656455fabe..f1710efea6ac2f675b02856a44fa0d4781befbed 100644 (file)
@@ -1,6 +1,6 @@
 /* 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 $
-
 */
 
 
@@ -38,8 +30,8 @@
 
 /* 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"
 
@@ -47,7 +39,56 @@ typedef struct dumpinfo dumpinfo;
 
 #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,34 +142,10 @@ 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 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))
@@ -139,18 +156,6 @@ struct dumpinfo {
 #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)))
@@ -163,7 +168,7 @@ struct dumpinfo {
 #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 ******************************************************************/
@@ -183,12 +188,19 @@ struct dumpinfo {
 /* 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);