Back to index

lightning-sunbird  0.9+nobinonly
gc_typed.h
Go to the documentation of this file.
00001 /* 
00002  * Copyright 1988, 1989 Hans-J. Boehm, Alan J. Demers
00003  * Copyright (c) 1991-1994 by Xerox Corporation.  All rights reserved.
00004  * Copyright 1996 Silicon Graphics.  All rights reserved.
00005  *
00006  * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
00007  * OR IMPLIED.  ANY USE IS AT YOUR OWN RISK.
00008  *
00009  * Permission is hereby granted to use or copy this program
00010  * for any purpose,  provided the above notices are retained on all copies.
00011  * Permission to modify the code and to distribute modified code is granted,
00012  * provided the above notices are retained, and a notice that the code was
00013  * modified is included with the above copyright notice.
00014  */
00015 /*
00016  * Some simple primitives for allocation with explicit type information.
00017  * Facilities for dynamic type inference may be added later.
00018  * Should be used only for extremely performance critical applications,
00019  * or if conservative collector leakage is otherwise a problem (unlikely).
00020  * Note that this is implemented completely separately from the rest
00021  * of the collector, and is not linked in unless referenced.
00022  * This does not currently support GC_DEBUG in any interesting way.
00023  */
00024 /* Boehm, May 19, 1994 2:13 pm PDT */
00025 
00026 #ifndef _GC_TYPED_H
00027 # define _GC_TYPED_H
00028 # ifndef _GC_H
00029 #   include "gc.h"
00030 # endif
00031 
00032 typedef GC_word * GC_bitmap;
00033        /* The least significant bit of the first word is one if       */
00034        /* the first word in the object may be a pointer.              */
00035        
00036 # define GC_get_bit(bm, index) \
00037               (((bm)[divWORDSZ(index)] >> modWORDSZ(index)) & 1)
00038 # define GC_set_bit(bm, index) \
00039               (bm)[divWORDSZ(index)] |= (word)1 << modWORDSZ(index)
00040 
00041 typedef GC_word GC_descr;
00042 
00043 GC_API GC_descr GC_make_descriptor GC_PROTO((GC_bitmap bm, size_t len));
00044               /* Return a type descriptor for the object whose layout */
00045               /* is described by the argument.                 */
00046               /* The least significant bit of the first word is one   */
00047               /* if the first word in the object may be a pointer.    */
00048               /* The second argument specifies the number of          */
00049               /* meaningful bits in the bitmap.  The actual object    */
00050               /* may be larger (but not smaller).  Any additional     */
00051               /* words in the object are assumed not to contain       */
00052               /* pointers.                                     */
00053               /* Returns a conservative approximation in the          */
00054               /* (unlikely) case of insufficient memory to build      */
00055               /* the descriptor.  Calls to GC_make_descriptor         */
00056               /* may consume some amount of a finite resource.  This  */
00057               /* is intended to be called once per type, not once     */
00058               /* per allocation.                               */
00059 
00060 GC_API GC_PTR GC_malloc_explicitly_typed
00061                      GC_PROTO((size_t size_in_bytes, GC_descr d));
00062               /* Allocate an object whose layout is described by d.   */
00063               /* The resulting object MAY NOT BE PASSED TO REALLOC.   */
00064 
00065 GC_API GC_PTR GC_malloc_explicitly_typed_ignore_off_page
00066                         GC_PROTO((size_t size_in_bytes, GC_descr d));
00067               
00068 GC_API GC_PTR GC_calloc_explicitly_typed
00069                      GC_PROTO((size_t nelements,
00070                               size_t element_size_in_bytes,
00071                               GC_descr d));
00072        /* Allocate an array of nelements elements, each of the */
00073        /* given size, and with the given descriptor.           */
00074        /* The elemnt size must be a multiple of the byte       */
00075        /* alignment required for pointers.  E.g. on a 32-bit   */
00076        /* machine with 16-bit aligned pointers, size_in_bytes  */
00077        /* must be a multiple of 2.                      */
00078 
00079 #ifdef GC_DEBUG
00080 #   define GC_MALLOC_EXPLICTLY_TYPED(bytes, d) GC_MALLOC(bytes)
00081 #   define GC_CALLOC_EXPLICTLY_TYPED(n, bytes, d) GC_MALLOC(n*bytes)
00082 #else
00083 #  define GC_MALLOC_EXPLICTLY_TYPED(bytes, d) \
00084        GC_malloc_explicitly_typed(bytes, d)
00085 #  define GC_CALLOC_EXPLICTLY_TYPED(n, bytes, d) \
00086        GC_calloc_explicitly_typed(n, bytes, d)
00087 #endif /* !GC_DEBUG */
00088 
00089 
00090 #endif /* _GC_TYPED_H */
00091