[BACK]Return to gc_typed.h CVS log [TXT][DIR] Up to [local] / OpenXM_contrib2 / asir2000 / gc / include

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>