boehm-gc: revert all CACAO-specific modifications; this is now an exact copy of the...
[cacao.git] / src / mm / boehm-gc / include / gc_typed.h
1 /* 
2  * Copyright 1988, 1989 Hans-J. Boehm, Alan J. Demers
3  * Copyright (c) 1991-1994 by Xerox Corporation.  All rights reserved.
4  * Copyright 1996 Silicon Graphics.  All rights reserved.
5  *
6  * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
7  * OR IMPLIED.  ANY USE IS AT YOUR OWN RISK.
8  *
9  * Permission is hereby granted to use or copy this program
10  * for any purpose,  provided the above notices are retained on all copies.
11  * Permission to modify the code and to distribute modified code is granted,
12  * provided the above notices are retained, and a notice that the code was
13  * modified is included with the above copyright notice.
14  */
15 /*
16  * Some simple primitives for allocation with explicit type information.
17  * Facilities for dynamic type inference may be added later.
18  * Should be used only for extremely performance critical applications,
19  * or if conservative collector leakage is otherwise a problem (unlikely).
20  * Note that this is implemented completely separately from the rest
21  * of the collector, and is not linked in unless referenced.
22  * This does not currently support GC_DEBUG in any interesting way.
23  */
24 /* Boehm, May 19, 1994 2:13 pm PDT */
25
26 #ifndef _GC_TYPED_H
27 # define _GC_TYPED_H
28 # ifndef _GC_H
29 #   include "gc.h"
30 # endif
31
32 #ifdef __cplusplus
33   extern "C" {
34 #endif
35 typedef GC_word * GC_bitmap;
36         /* The least significant bit of the first word is one if        */
37         /* the first word in the object may be a pointer.               */
38         
39 # define GC_WORDSZ (8*sizeof(GC_word))
40 # define GC_get_bit(bm, index) \
41                 (((bm)[index/GC_WORDSZ] >> (index%GC_WORDSZ)) & 1)
42 # define GC_set_bit(bm, index) \
43                 (bm)[index/GC_WORDSZ] |= ((GC_word)1 << (index%GC_WORDSZ))
44 # define GC_WORD_OFFSET(t, f) (offsetof(t,f)/sizeof(GC_word))
45 # define GC_WORD_LEN(t) (sizeof(t)/ sizeof(GC_word))
46 # define GC_BITMAP_SIZE(t) ((GC_WORD_LEN(t) + GC_WORDSZ-1)/GC_WORDSZ)
47
48 typedef GC_word GC_descr;
49
50 GC_API GC_descr GC_CALL GC_make_descriptor(GC_bitmap bm, size_t len);
51                 /* Return a type descriptor for the object whose layout */
52                 /* is described by the argument.                        */
53                 /* The least significant bit of the first word is one   */
54                 /* if the first word in the object may be a pointer.    */
55                 /* The second argument specifies the number of          */
56                 /* meaningful bits in the bitmap.  The actual object    */
57                 /* may be larger (but not smaller).  Any additional     */
58                 /* words in the object are assumed not to contain       */
59                 /* pointers.                                            */
60                 /* Returns a conservative approximation in the          */
61                 /* (unlikely) case of insufficient memory to build      */
62                 /* the descriptor.  Calls to GC_make_descriptor         */
63                 /* may consume some amount of a finite resource.  This  */
64                 /* is intended to be called once per type, not once     */
65                 /* per allocation.                                      */
66
67 /* It is possible to generate a descriptor for a C type T with  */
68 /* word aligned pointer fields f1, f2, ... as follows:                  */
69 /*                                                                      */
70 /* GC_descr T_descr;                                                    */
71 /* GC_word T_bitmap[GC_BITMAP_SIZE(T)] = {0};                           */
72 /* GC_set_bit(T_bitmap, GC_WORD_OFFSET(T,f1));                          */
73 /* GC_set_bit(T_bitmap, GC_WORD_OFFSET(T,f2));                          */
74 /* ...                                                                  */
75 /* T_descr = GC_make_descriptor(T_bitmap, GC_WORD_LEN(T));              */
76
77 GC_API void * GC_CALL GC_malloc_explicitly_typed(size_t size_in_bytes,
78                                                 GC_descr d);
79                 /* Allocate an object whose layout is described by d.   */
80                 /* The resulting object MAY NOT BE PASSED TO REALLOC.   */
81                 /* The returned object is cleared.                      */
82
83 GC_API void * GC_CALL GC_malloc_explicitly_typed_ignore_off_page
84                         (size_t size_in_bytes, GC_descr d);
85                 
86 GC_API void * GC_CALL GC_calloc_explicitly_typed(size_t nelements,
87                                          size_t element_size_in_bytes,
88                                          GC_descr d);
89         /* Allocate an array of nelements elements, each of the */
90         /* given size, and with the given descriptor.           */
91         /* The element size must be a multiple of the byte      */
92         /* alignment required for pointers.  E.g. on a 32-bit   */
93         /* machine with 16-bit aligned pointers, size_in_bytes  */
94         /* must be a multiple of 2.                             */
95         /* Returned object is cleared.                          */
96
97 #ifdef GC_DEBUG
98 #   define GC_MALLOC_EXPLICITLY_TYPED(bytes, d) GC_MALLOC(bytes)
99 #   define GC_CALLOC_EXPLICITLY_TYPED(n, bytes, d) GC_MALLOC(n*bytes)
100 #else
101 #  define GC_MALLOC_EXPLICITLY_TYPED(bytes, d) \
102         GC_malloc_explicitly_typed(bytes, d)
103 #  define GC_CALLOC_EXPLICITLY_TYPED(n, bytes, d) \
104         GC_calloc_explicitly_typed(n, bytes, d)
105 #endif /* !GC_DEBUG */
106
107 #ifdef __cplusplus
108   } /* matches extern "C" */
109 #endif
110
111 #endif /* _GC_TYPED_H */
112