| /* |
| * Copyright 1988, 1989 Hans-J. Boehm, Alan J. Demers |
| * Copyright (c) 1991-1994 by Xerox Corporation. All rights reserved. |
| * Copyright 1996 Silicon Graphics. All rights reserved. |
| * |
| * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED |
| * OR IMPLIED. ANY USE IS AT YOUR OWN RISK. |
| * |
| * Permission is hereby granted to use or copy this program |
| * for any purpose, provided the above notices are retained on all copies. |
| * Permission to modify the code and to distribute modified code is granted, |
| * provided the above notices are retained, and a notice that the code was |
| * modified is included with the above copyright notice. |
| */ |
| /* |
| * Some simple primitives for allocation with explicit type information. |
| * Facilities for dynamic type inference may be added later. |
| * Should be used only for extremely performance critical applications, |
| * or if conservative collector leakage is otherwise a problem (unlikely). |
| * Note that this is implemented completely separately from the rest |
| * of the collector, and is not linked in unless referenced. |
| * This does not currently support GC_DEBUG in any interesting way. |
| */ |
| /* Boehm, May 19, 1994 2:13 pm PDT */ |
| |
| #ifndef _GC_TYPED_H |
| # define _GC_TYPED_H |
| # ifndef _GC_H |
| # include "gc.h" |
| # endif |
| |
| #ifdef __cplusplus |
| extern "C" { |
| #endif |
| typedef GC_word * GC_bitmap; |
| /* The least significant bit of the first word is one if */ |
| /* the first word in the object may be a pointer. */ |
| |
| # define GC_WORDSZ (8*sizeof(GC_word)) |
| # define GC_get_bit(bm, index) \ |
| (((bm)[index/GC_WORDSZ] >> (index%GC_WORDSZ)) & 1) |
| # define GC_set_bit(bm, index) \ |
| (bm)[index/GC_WORDSZ] |= ((GC_word)1 << (index%GC_WORDSZ)) |
| # define GC_WORD_OFFSET(t, f) (offsetof(t,f)/sizeof(GC_word)) |
| # define GC_WORD_LEN(t) (sizeof(t)/ sizeof(GC_word)) |
| # define GC_BITMAP_SIZE(t) ((GC_WORD_LEN(t) + GC_WORDSZ-1)/GC_WORDSZ) |
| |
| typedef GC_word GC_descr; |
| |
| GC_API GC_descr GC_make_descriptor GC_PROTO((GC_bitmap bm, size_t len)); |
| /* Return a type descriptor for the object whose layout */ |
| /* is described by the argument. */ |
| /* The least significant bit of the first word is one */ |
| /* if the first word in the object may be a pointer. */ |
| /* The second argument specifies the number of */ |
| /* meaningful bits in the bitmap. The actual object */ |
| /* may be larger (but not smaller). Any additional */ |
| /* words in the object are assumed not to contain */ |
| /* pointers. */ |
| /* Returns a conservative approximation in the */ |
| /* (unlikely) case of insufficient memory to build */ |
| /* the descriptor. Calls to GC_make_descriptor */ |
| /* may consume some amount of a finite resource. This */ |
| /* is intended to be called once per type, not once */ |
| /* per allocation. */ |
| |
| /* It is possible to generate a descriptor for a C type T with */ |
| /* word aligned pointer fields f1, f2, ... as follows: */ |
| /* */ |
| /* GC_descr T_descr; */ |
| /* GC_word T_bitmap[GC_BITMAP_SIZE(T)] = {0}; */ |
| /* GC_set_bit(T_bitmap, GC_WORD_OFFSET(T,f1)); */ |
| /* GC_set_bit(T_bitmap, GC_WORD_OFFSET(T,f2)); */ |
| /* ... */ |
| /* T_descr = GC_make_descriptor(T_bitmap, GC_WORD_LEN(T)); */ |
| |
| GC_API GC_PTR GC_malloc_explicitly_typed |
| GC_PROTO((size_t size_in_bytes, GC_descr d)); |
| /* Allocate an object whose layout is described by d. */ |
| /* The resulting object MAY NOT BE PASSED TO REALLOC. */ |
| /* The returned object is cleared. */ |
| |
| GC_API GC_PTR GC_malloc_explicitly_typed_ignore_off_page |
| GC_PROTO((size_t size_in_bytes, GC_descr d)); |
| |
| GC_API GC_PTR GC_calloc_explicitly_typed |
| GC_PROTO((size_t nelements, |
| size_t element_size_in_bytes, |
| GC_descr d)); |
| /* Allocate an array of nelements elements, each of the */ |
| /* given size, and with the given descriptor. */ |
| /* The elemnt size must be a multiple of the byte */ |
| /* alignment required for pointers. E.g. on a 32-bit */ |
| /* machine with 16-bit aligned pointers, size_in_bytes */ |
| /* must be a multiple of 2. */ |
| /* Returned object is cleared. */ |
| |
| #ifdef GC_DEBUG |
| # define GC_MALLOC_EXPLICITLY_TYPED(bytes, d) GC_MALLOC(bytes) |
| # define GC_CALLOC_EXPLICITLY_TYPED(n, bytes, d) GC_MALLOC(n*bytes) |
| #else |
| # define GC_MALLOC_EXPLICITLY_TYPED(bytes, d) \ |
| GC_malloc_explicitly_typed(bytes, d) |
| # define GC_CALLOC_EXPLICITLY_TYPED(n, bytes, d) \ |
| GC_calloc_explicitly_typed(n, bytes, d) |
| #endif /* !GC_DEBUG */ |
| |
| #ifdef __cplusplus |
| } /* matches extern "C" */ |
| #endif |
| |
| #endif /* _GC_TYPED_H */ |
| |