boehm-gc: revert all CACAO-specific modifications; this is now an exact copy of the...
[cacao.git] / src / mm / boehm-gc / include / gc_gcj.h
1 /* 
2  * Copyright 1988, 1989 Hans-J. Boehm, Alan J. Demers
3  * Copyright (c) 1991-1995 by Xerox Corporation.  All rights reserved.
4  * Copyright 1996-1999 by Silicon Graphics.  All rights reserved.
5  * Copyright 1999 by Hewlett-Packard Company.  All rights reserved.
6  *
7  * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
8  * OR IMPLIED.  ANY USE IS AT YOUR OWN RISK.
9  *
10  * Permission is hereby granted to use or copy this program
11  * for any purpose,  provided the above notices are retained on all copies.
12  * Permission to modify the code and to distribute modified code is granted,
13  * provided the above notices are retained, and a notice that the code was
14  * modified is included with the above copyright notice.
15  */
16
17 /* This file assumes the collector has been compiled with GC_GCJ_SUPPORT. */
18
19 /*
20  * We allocate objects whose first word contains a pointer to a struct
21  * describing the object type.  This struct contains a garbage collector mark
22  * descriptor at offset MARK_DESCR_OFFSET.  Alternatively, the objects
23  * may be marked by the mark procedure passed to GC_init_gcj_malloc.
24  */
25
26 #ifndef GC_GCJ_H
27
28 #define GC_GCJ_H
29
30         /* Gcj keeps GC descriptor as second word of vtable.    This    */
31         /* probably needs to be adjusted for other clients.             */
32         /* We currently assume that this offset is such that:           */
33         /*      - all objects of this kind are large enough to have     */
34         /*        a value at that offset, and                           */
35         /*      - it is not zero.                                       */
36         /* These assumptions allow objects on the free list to be       */
37         /* marked normally.                                             */
38
39 #ifndef _GC_H
40 #   include "gc.h"
41 #endif
42
43 # ifdef __cplusplus
44     extern "C" {
45 # endif
46
47 /* The following allocators signal an out of memory condition with      */
48 /* return GC_oom_fn(bytes);                                             */
49
50 /* The following function must be called before the gcj allocators      */
51 /* can be invoked.                                                      */
52 /* mp_index and mp are the index and mark_proc (see gc_mark.h)          */
53 /* respectively for the allocated objects.  Mark_proc will be           */
54 /* used to build the descriptor for objects allocated through the       */
55 /* debugging interface.  The mark_proc will be invoked on all such      */
56 /* objects with an "environment" value of 1.  The client may choose     */
57 /* to use the same mark_proc for some of its generated mark descriptors.*/
58 /* In that case, it should use a different "environment" value to       */
59 /* detect the presence or absence of the debug header.                  */
60 /* Mp is really of type mark_proc, as defined in gc_mark.h.  We don't   */
61 /* want to include that here for namespace pollution reasons.           */
62 /* Passing in mp_index here instead of having GC_init_gcj_malloc()      */
63 /* internally call GC_new_proc() is quite ugly, but in typical usage    */
64 /* scenarios a compiler also has to know about mp_index, so             */
65 /* generating it dynamically is not acceptable.  Mp_index will          */
66 /* typically be an integer < RESERVED_MARK_PROCS, so that it doesn't    */
67 /* collide with GC_new_proc allocated indices.  If the application      */
68 /* needs no other reserved indices, zero                                */
69 /* (GC_GCJ_RESERVED_MARK_PROC_INDEX in gc_mark.h) is an obvious choice. */ 
70 GC_API void GC_CALL GC_init_gcj_malloc(int mp_index,
71                                 void * /* really mark_proc */mp);
72
73 /* Allocate an object, clear it, and store the pointer to the   */
74 /* type structure (vtable in gcj).                              */
75 /* This adds a byte at the end of the object if GC_malloc would.*/
76 GC_API void * GC_CALL GC_gcj_malloc(size_t lb,
77                                 void * ptr_to_struct_containing_descr);
78 /* The debug versions allocate such that the specified mark_proc        */
79 /* is always invoked.                                                   */
80 GC_API void * GC_CALL GC_debug_gcj_malloc(size_t lb,
81                                   void * ptr_to_struct_containing_descr,
82                                   GC_EXTRA_PARAMS);
83
84 /* Similar to GC_gcj_malloc, but assumes that a pointer to near the     */
85 /* beginning of the resulting object is always maintained.              */
86 GC_API void  * GC_CALL GC_gcj_malloc_ignore_off_page(size_t lb,
87                                 void * ptr_to_struct_containing_descr);
88
89 /* The kind numbers of normal and debug gcj objects.            */
90 /* Useful only for debug support, we hope.                      */
91 GC_API int GC_gcj_kind;
92
93 GC_API int GC_gcj_debug_kind;
94
95 # ifdef GC_DEBUG
96 #   define GC_GCJ_MALLOC(s,d) GC_debug_gcj_malloc(s,d,GC_EXTRAS)
97 #   define GC_GCJ_MALLOC_IGNORE_OFF_PAGE(s,d) GC_debug_gcj_malloc(s,d,GC_EXTRAS)
98 # else
99 #   define GC_GCJ_MALLOC(s,d) GC_gcj_malloc(s,d)
100 #   define GC_GCJ_MALLOC_IGNORE_OFF_PAGE(s,d) \
101         GC_gcj_malloc_ignore_off_page(s,d)
102 # endif
103
104 # ifdef __cplusplus
105     }  /* end of extern "C" */
106 # endif
107
108 #endif /* GC_GCJ_H */