[BACK]Return to gc_hdrs.h CVS log [TXT][DIR] Up to [local] / OpenXM_contrib / gc

Annotation of OpenXM_contrib/gc/gc_hdrs.h, Revision 1.1.1.1

1.1       maekawa     1: /*
                      2:  * Copyright 1988, 1989 Hans-J. Boehm, Alan J. Demers
                      3:  * Copyright (c) 1991-1994 by Xerox Corporation.  All rights reserved.
                      4:  *
                      5:  * THIS MATERIAL IS PROVIDED AS IS, WITH ABSOLUTELY NO WARRANTY EXPRESSED
                      6:  * OR IMPLIED.  ANY USE IS AT YOUR OWN RISK.
                      7:  *
                      8:  * Permission is hereby granted to use or copy this program
                      9:  * for any purpose,  provided the above notices are retained on all copies.
                     10:  * Permission to modify the code and to distribute modified code is granted,
                     11:  * provided the above notices are retained, and a notice that the code was
                     12:  * modified is included with the above copyright notice.
                     13:  */
                     14: /* Boehm, July 11, 1995 11:54 am PDT */
                     15: # ifndef GC_HEADERS_H
                     16: # define GC_HEADERS_H
                     17: typedef struct hblkhdr hdr;
                     18:
                     19: # if CPP_WORDSZ != 32 && CPP_WORDSZ < 36
                     20:        --> Get a real machine.
                     21: # endif
                     22:
                     23: /*
                     24:  * The 2 level tree data structure that is used to find block headers.
                     25:  * If there are more than 32 bits in a pointer, the top level is a hash
                     26:  * table.
                     27:  */
                     28:
                     29: # if CPP_WORDSZ > 32
                     30: #   define HASH_TL
                     31: # endif
                     32:
                     33: /* Define appropriate out-degrees for each of the two tree levels      */
                     34: # ifdef SMALL_CONFIG
                     35: #   define LOG_BOTTOM_SZ 11
                     36:        /* Keep top index size reasonable with smaller blocks. */
                     37: # else
                     38: #   define LOG_BOTTOM_SZ 10
                     39: # endif
                     40: # ifndef HASH_TL
                     41: #   define LOG_TOP_SZ (WORDSZ - LOG_BOTTOM_SZ - LOG_HBLKSIZE)
                     42: # else
                     43: #   define LOG_TOP_SZ 11
                     44: # endif
                     45: # define TOP_SZ (1 << LOG_TOP_SZ)
                     46: # define BOTTOM_SZ (1 << LOG_BOTTOM_SZ)
                     47:
                     48: typedef struct bi {
                     49:     hdr * index[BOTTOM_SZ];
                     50:        /*
                     51:         * The bottom level index contains one of three kinds of values:
                     52:         * 0 means we're not responsible for this block.
                     53:         * 1 < (long)X <= MAX_JUMP means the block starts at least
                     54:         *        X * HBLKSIZE bytes before the current address.
                     55:         * A valid pointer points to a hdr structure. (The above can't be
                     56:         * valid pointers due to the GET_MEM return convention.)
                     57:         */
                     58:     struct bi * asc_link;      /* All indices are linked in    */
                     59:                                /* ascending order.             */
                     60:     word key;                  /* high order address bits.     */
                     61: # ifdef HASH_TL
                     62:     struct bi * hash_link;     /* Hash chain link.             */
                     63: # endif
                     64: } bottom_index;
                     65:
                     66: /* extern bottom_index GC_all_nils; - really part of GC_arrays */
                     67:
                     68: /* extern bottom_index * GC_top_index []; - really part of GC_arrays */
                     69:                                /* Each entry points to a bottom_index. */
                     70:                                /* On a 32 bit machine, it points to    */
                     71:                                /* the index for a set of high order    */
                     72:                                /* bits equal to the index.  For longer */
                     73:                                /* addresses, we hash the high order    */
                     74:                                /* bits to compute the index in         */
                     75:                                /* GC_top_index, and each entry points  */
                     76:                                /* to a hash chain.                     */
                     77:                                /* The last entry in each chain is      */
                     78:                                /* GC_all_nils.                         */
                     79:
                     80:
                     81: # define MAX_JUMP (HBLKSIZE - 1)
                     82:
                     83: # define HDR_FROM_BI(bi, p) \
                     84:                ((bi)->index[((word)(p) >> LOG_HBLKSIZE) & (BOTTOM_SZ - 1)])
                     85: # ifndef HASH_TL
                     86: #   define BI(p) (GC_top_index \
                     87:                [(word)(p) >> (LOG_BOTTOM_SZ + LOG_HBLKSIZE)])
                     88: #   define HDR_INNER(p) HDR_FROM_BI(BI(p),p)
                     89: #   ifdef SMALL_CONFIG
                     90: #      define HDR(p) GC_find_header((ptr_t)(p))
                     91: #   else
                     92: #      define HDR(p) HDR_INNER(p)
                     93: #   endif
                     94: #   define GET_BI(p, bottom_indx) (bottom_indx) = BI(p)
                     95: #   define GET_HDR(p, hhdr) (hhdr) = HDR(p)
                     96: #   define SET_HDR(p, hhdr) HDR_INNER(p) = (hhdr)
                     97: #   define GET_HDR_ADDR(p, ha) (ha) = &(HDR_INNER(p))
                     98: # else /* hash */
                     99: /*  Hash function for tree top level */
                    100: #   define TL_HASH(hi) ((hi) & (TOP_SZ - 1))
                    101: /*  Set bottom_indx to point to the bottom index for address p */
                    102: #   define GET_BI(p, bottom_indx) \
                    103:        { \
                    104:            register word hi = \
                    105:                (word)(p) >> (LOG_BOTTOM_SZ + LOG_HBLKSIZE); \
                    106:            register bottom_index * _bi = GC_top_index[TL_HASH(hi)]; \
                    107:            \
                    108:            while (_bi -> key != hi && _bi != GC_all_nils) \
                    109:                _bi = _bi -> hash_link; \
                    110:            (bottom_indx) = _bi; \
                    111:        }
                    112: #   define GET_HDR_ADDR(p, ha) \
                    113:        { \
                    114:            register bottom_index * bi; \
                    115:            \
                    116:            GET_BI(p, bi);      \
                    117:            (ha) = &(HDR_FROM_BI(bi, p)); \
                    118:        }
                    119: #   define GET_HDR(p, hhdr) { register hdr ** _ha; GET_HDR_ADDR(p, _ha); \
                    120:                              (hhdr) = *_ha; }
                    121: #   define SET_HDR(p, hhdr) { register hdr ** _ha; GET_HDR_ADDR(p, _ha); \
                    122:                              *_ha = (hhdr); }
                    123: #   define HDR(p) GC_find_header((ptr_t)(p))
                    124: # endif
                    125:
                    126: /* Is the result a forwarding address to someplace closer to the       */
                    127: /* beginning of the block or NIL?                                      */
                    128: # define IS_FORWARDING_ADDR_OR_NIL(hhdr) ((unsigned long) (hhdr) <= MAX_JUMP)
                    129:
                    130: /* Get an HBLKSIZE aligned address closer to the beginning of the block */
                    131: /* h.  Assumes hhdr == HDR(h) and IS_FORWARDING_ADDR(hhdr).            */
                    132: # define FORWARDED_ADDR(h, hhdr) ((struct hblk *)(h) - (unsigned long)(hhdr))
                    133: # endif /*  GC_HEADERS_H */

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>