/* * 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 */