* Removed all Id tags.
[cacao.git] / src / mm / memory.h
index 6106a1d94012f145b361e11c7923333f2adaf4e9..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 4406 2006-02-03 13:19:36Z twisti $
-
 */
 
 
 #ifndef _MEMORY_H
 #define _MEMORY_H
 
-#include <string.h>
-
 /* 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 <string.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,34 +142,10 @@ Some more macros:
 
 */
 
+#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 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)))
-
-#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,1)
-#define FREE(ptr,type)        GCFREE(ptr)
-
-#define MNEW(type,num)        GCNEW(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)))
@@ -159,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 ******************************************************************/
@@ -182,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);