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

Annotation of OpenXM_contrib2/asir2000/gc/include/gc_inl.h, Revision 1.1

1.1     ! noro        1: /*
        !             2:  * Copyright 1988, 1989 Hans-J. Boehm, Alan J. Demers
        !             3:  * Copyright (c) 1991-1995 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, October 3, 1995 2:07 pm PDT */
        !            15:
        !            16: # ifndef GC_PRIVATE_H
        !            17: #   include "private/gc_priv.h"
        !            18: # endif
        !            19:
        !            20: /* USE OF THIS FILE IS NOT RECOMMENDED unless the collector has been   */
        !            21: /* compiled without -DALL_INTERIOR_POINTERS or with                    */
        !            22: /* -DDONT_ADD_BYTE_AT_END, or the specified size includes a pointerfree        */
        !            23: /* word at the end.  In the standard collector configuration,          */
        !            24: /* the final word of each object may not be scanned.                   */
        !            25: /* This is most useful for compilers that generate C.                  */
        !            26: /* Manual use is hereby discouraged.                                   */
        !            27:
        !            28: /* Allocate n words (NOT BYTES).  X is made to point to the result.    */
        !            29: /* It is assumed that n < MAXOBJSZ, and                                        */
        !            30: /* that n > 0.  On machines requiring double word alignment of some    */
        !            31: /* data, we also assume that n is 1 or even.  This bypasses the                */
        !            32: /* MERGE_SIZES mechanism.  In order to minimize the number of distinct */
        !            33: /* free lists that are maintained, the caller should ensure that a     */
        !            34: /* small number of distinct values of n are used.  (The MERGE_SIZES    */
        !            35: /* mechanism normally does this by ensuring that only the leading three        */
        !            36: /* bits of n may be nonzero.  See misc.c for details.)  We really      */
        !            37: /* recommend this only in cases in which n is a constant, and no       */
        !            38: /* locking is required.                                                        */
        !            39: /* In that case it may allow the compiler to perform substantial       */
        !            40: /* additional optimizations.                                           */
        !            41: # define GC_MALLOC_WORDS(result,n) \
        !            42: {      \
        !            43:     register ptr_t op; \
        !            44:     register ptr_t *opp;       \
        !            45:     DCL_LOCK_STATE;    \
        !            46:        \
        !            47:     opp = &(GC_objfreelist[n]);        \
        !            48:     FASTLOCK();        \
        !            49:     if( !FASTLOCK_SUCCEEDED() || (op = *opp) == 0 ) {  \
        !            50:         FASTUNLOCK();  \
        !            51:         (result) = GC_generic_malloc_words_small((n), NORMAL); \
        !            52:     } else {   \
        !            53:         *opp = obj_link(op);   \
        !            54:         obj_link(op) = 0;      \
        !            55:         GC_words_allocd += (n);        \
        !            56:         FASTUNLOCK();  \
        !            57:         (result) = (GC_PTR) op;        \
        !            58:     }  \
        !            59: }
        !            60:
        !            61:
        !            62: /* The same for atomic objects:        */
        !            63: # define GC_MALLOC_ATOMIC_WORDS(result,n) \
        !            64: {      \
        !            65:     register ptr_t op; \
        !            66:     register ptr_t *opp;       \
        !            67:     DCL_LOCK_STATE;    \
        !            68:        \
        !            69:     opp = &(GC_aobjfreelist[n]);       \
        !            70:     FASTLOCK();        \
        !            71:     if( !FASTLOCK_SUCCEEDED() || (op = *opp) == 0 ) {  \
        !            72:         FASTUNLOCK();  \
        !            73:         (result) = GC_generic_malloc_words_small((n), PTRFREE);        \
        !            74:     } else {   \
        !            75:         *opp = obj_link(op);   \
        !            76:         obj_link(op) = 0;      \
        !            77:         GC_words_allocd += (n);        \
        !            78:         FASTUNLOCK();  \
        !            79:         (result) = (GC_PTR) op;        \
        !            80:     }  \
        !            81: }
        !            82:
        !            83: /* And once more for two word initialized objects: */
        !            84: # define GC_CONS(result, first, second) \
        !            85: {      \
        !            86:     register ptr_t op; \
        !            87:     register ptr_t *opp;       \
        !            88:     DCL_LOCK_STATE;    \
        !            89:        \
        !            90:     opp = &(GC_objfreelist[2]);        \
        !            91:     FASTLOCK();        \
        !            92:     if( !FASTLOCK_SUCCEEDED() || (op = *opp) == 0 ) {  \
        !            93:         FASTUNLOCK();  \
        !            94:         op = GC_generic_malloc_words_small(2, NORMAL); \
        !            95:     } else {   \
        !            96:         *opp = obj_link(op);   \
        !            97:         GC_words_allocd += 2;  \
        !            98:         FASTUNLOCK();  \
        !            99:     } \
        !           100:     ((word *)op)[0] = (word)(first);   \
        !           101:     ((word *)op)[1] = (word)(second);  \
        !           102:     (result) = (GC_PTR) op;    \
        !           103: }

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