Annotation of OpenXM_contrib2/asir2000/gc/include/gc_typed.h, Revision 1.5
1.1 noro 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:
1.5 ! noro 32: #ifdef __cplusplus
! 33: extern "C" {
! 34: #endif
1.1 noro 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:
1.5 ! noro 39: # define GC_WORDSZ (8*sizeof(GC_word))
1.1 noro 40: # define GC_get_bit(bm, index) \
1.5 ! noro 41: (((bm)[index/GC_WORDSZ] >> (index%GC_WORDSZ)) & 1)
1.1 noro 42: # define GC_set_bit(bm, index) \
1.5 ! noro 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)
1.1 noro 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:
1.5 ! noro 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:
1.1 noro 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. */
1.2 noro 81: /* The returned object is cleared. */
1.1 noro 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. */
1.2 noro 96: /* Returned object is cleared. */
1.1 noro 97:
98: #ifdef GC_DEBUG
1.5 ! noro 99: # define GC_MALLOC_EXPLICITLY_TYPED(bytes, d) GC_MALLOC(bytes)
! 100: # define GC_CALLOC_EXPLICITLY_TYPED(n, bytes, d) GC_MALLOC(n*bytes)
1.1 noro 101: #else
1.5 ! noro 102: # define GC_MALLOC_EXPLICITLY_TYPED(bytes, d) \
1.1 noro 103: GC_malloc_explicitly_typed(bytes, d)
1.5 ! noro 104: # define GC_CALLOC_EXPLICITLY_TYPED(n, bytes, d) \
1.1 noro 105: GC_calloc_explicitly_typed(n, bytes, d)
106: #endif /* !GC_DEBUG */
107:
1.5 ! noro 108: #ifdef __cplusplus
! 109: } /* matches extern "C" */
! 110: #endif
1.1 noro 111:
112: #endif /* _GC_TYPED_H */
113:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>