1 |
721 |
jeremybenn |
/*
|
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_make_descriptor GC_PROTO((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 GC_PTR GC_malloc_explicitly_typed
|
78 |
|
|
GC_PROTO((size_t size_in_bytes, 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 GC_PTR GC_malloc_explicitly_typed_ignore_off_page
|
84 |
|
|
GC_PROTO((size_t size_in_bytes, GC_descr d));
|
85 |
|
|
|
86 |
|
|
GC_API GC_PTR GC_calloc_explicitly_typed
|
87 |
|
|
GC_PROTO((size_t nelements,
|
88 |
|
|
size_t element_size_in_bytes,
|
89 |
|
|
GC_descr d));
|
90 |
|
|
/* Allocate an array of nelements elements, each of the */
|
91 |
|
|
/* given size, and with the given descriptor. */
|
92 |
|
|
/* The elemnt size must be a multiple of the byte */
|
93 |
|
|
/* alignment required for pointers. E.g. on a 32-bit */
|
94 |
|
|
/* machine with 16-bit aligned pointers, size_in_bytes */
|
95 |
|
|
/* must be a multiple of 2. */
|
96 |
|
|
/* Returned object is cleared. */
|
97 |
|
|
|
98 |
|
|
#ifdef GC_DEBUG
|
99 |
|
|
# define GC_MALLOC_EXPLICITLY_TYPED(bytes, d) GC_MALLOC(bytes)
|
100 |
|
|
# define GC_CALLOC_EXPLICITLY_TYPED(n, bytes, d) GC_MALLOC(n*bytes)
|
101 |
|
|
#else
|
102 |
|
|
# define GC_MALLOC_EXPLICITLY_TYPED(bytes, d) \
|
103 |
|
|
GC_malloc_explicitly_typed(bytes, d)
|
104 |
|
|
# define GC_CALLOC_EXPLICITLY_TYPED(n, bytes, d) \
|
105 |
|
|
GC_calloc_explicitly_typed(n, bytes, d)
|
106 |
|
|
#endif /* !GC_DEBUG */
|
107 |
|
|
|
108 |
|
|
#ifdef __cplusplus
|
109 |
|
|
} /* matches extern "C" */
|
110 |
|
|
#endif
|
111 |
|
|
|
112 |
|
|
#endif /* _GC_TYPED_H */
|
113 |
|
|
|