root/gc/include/gc_typed.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


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

/* [<][>][^][v][top][bottom][index][help] */