Annotation of coherent/f/usr/include/kernel/st_alloc.h, revision 1.1

1.1     ! root        1: #ifndef __KERNEL_ST_ALLOC_H__
        !             2: #define        __KERNEL_ST_ALLOC_H__
        !             3: 
        !             4: /*
        !             5:  *-IMPORTS:
        !             6:  *     <common/ccompat.h>
        !             7:  *             __CONST__
        !             8:  *             __PROTO__
        !             9:  *             __VOID__
        !            10:  *             __PROTO ()
        !            11:  *     <common/xdebug.h>
        !            12:  *             __LOCAL__
        !            13:  */
        !            14: 
        !            15: #include <limits.h>
        !            16: #include <common/ccompat.h>
        !            17: #include <common/xdebug.h>
        !            18: #include <common/_size.h>
        !            19: 
        !            20: 
        !            21: /*
        !            22:  * Definitions/declarations for the quick arena manager.
        !            23:  *
        !            24:  * The quick arena manager's basic algorithm utilizes a heap (in the sense
        !            25:  * defined below) to implement a binary-searchable index of block buckets
        !            26:  * ordered by size.
        !            27:  *
        !            28:  * The primariy characteristic of this algorithm is its' speed ; the growth
        !            29:  * rate of the execution time is O (log W), where W is the number of words in
        !            30:  * the arena being managed. 
        !            31:  *
        !            32:  * This implementation is directly derived from the article in which this
        !            33:  * algorithm first appeared;
        !            34:  *
        !            35:  *     "Efficient Implementation of the First-Fit Strategy for Dynamic
        !            36:  *      Storage Allocation"
        !            37:  *     R. P. Brent, Australian National University
        !            38:  *     ACM Transactions on Programming Languages and Systems
        !            39:  *     Volume 11, No. 3, July 1989 pp 388-403.
        !            40:  */
        !            41: 
        !            42: 
        !            43: /*
        !            44:  * This source code deviates somewhat from the terminology used in the
        !            45:  * article, due to the large number of ambiguous terms here. The following
        !            46:  * definitions are used exclusively in the commentary and selection of
        !            47:  * identifiers within this source code :
        !            48:  *
        !            49:  *     heap            a balanced binary tree with implicit links, esp.
        !            50:  *                     used to perform max/min calculations or binary search
        !            51:  *
        !            52:  *     arena           the memory area being managed
        !            53:  *
        !            54:  *     block           a single unit of contiguous allocated or free memory
        !            55:  *
        !            56:  *     bucket          a subsection of the heap containing zero or more
        !            57:  *                     blocks
        !            58:  */
        !            59: 
        !            60: 
        !            61: /*
        !            62:  * Definition of the type of an underlying machine address for each one of
        !            63:  * the pointer types used in the arena control structure.
        !            64:  *
        !            65:  * An interesting question : what type should be being used for the heap
        !            66:  * control words, short or long? If a short is used for the size of a
        !            67:  * control word, then we are limited to 64k bytes for the size of a single
        !            68:  * allocation arena.
        !            69:  */
        !            70: 
        !            71: typedef int                    _ST_WORD_T;
        !            72: 
        !            73: #if    INT_MAX > SHRT_MAX
        !            74: #define        _ST_SIZE_MASK           0x7FFFFFFF
        !            75: #define        _ST_FREE_MASK           0x80000000
        !            76: #else
        !            77: #define        _ST_SIZE_MASK           0x7FFF
        !            78: #define        _ST_FREE_MASK           0x8000
        !            79: #endif
        !            80: 
        !            81: typedef _ST_WORD_T           * _ST_ADDR_T;
        !            82: 
        !            83: #define        _ST_HEAP_ADDR(q,a)      (a)
        !            84: #define        _ST_HEAP_BUCKET(q,a)    (((char *) (a) - (char *) (q)->_arena_base) / ((q)->_words_per_bucket * sizeof (_ST_WORD_T)))
        !            85: 
        !            86: 
        !            87: /*
        !            88:  * For the control word of a block, it is *vital* that all used blocks
        !            89:  * compare as "<" with a free block, and that free blocks test as normal
        !            90:  * integers.
        !            91:  */
        !            92: 
        !            93: #define        _ST_BLOCK_CONTROL(q,a)          (* _ST_HEAP_ADDR (q, (a)))
        !            94: #define        _ST_BLOCK_SIZE(c)               ((c) & _ST_SIZE_MASK)
        !            95: #define        _ST_BLOCK_FREE(c)               (((c) & _ST_FREE_MASK) == 0)
        !            96: #define        _ST_BLOCK_SET_FREE(q,a,n)       (void) (_ST_BLOCK_CONTROL (q, (a)) = (n) & ~ _ST_FREE_MASK)
        !            97: #define        _ST_BLOCK_SET_USED(q,a,n)       (void) (_ST_BLOCK_CONTROL (q, (a)) = (n) | _ST_FREE_MASK)
        !            98: 
        !            99: 
        !           100: #define        _ST_HEAP_BIGGEST(q,s)   ((q)->_bucket_biggest [s])
        !           101: #define        _ST_HEAP_FIRST(q,s)     ((q)->_bucket_first [s])
        !           102: 
        !           103: #define        _ST_BUCKET_SIBLING(b)   (b ^ 1)
        !           104: #define        _ST_BUCKET_PARENT(b)    (b >>= 1)
        !           105: 
        !           106: #define        _ST_HEAP_NEXT(a,c)      ((_ST_ADDR_T) ((a) + _ST_BLOCK_SIZE (c)))
        !           107: #define        _ST_HEAP_NEXT_RAW(a,c)  ((_ST_ADDR_T) ((a) + (c)))
        !           108: 
        !           109: #define        _ST_SET_ERROR(q,e)      ((q)->_heap_error = (e))
        !           110: #define        _ST_HEAP_ERROR(q)       ((q)->_heap_error)
        !           111: 
        !           112: 
        !           113: /*
        !           114:  * Help clients initialise the arena.
        !           115:  */
        !           116: 
        !           117: #define        _ST_HEAP_CONTROL_SIZE(segs)\
        !           118:        (sizeof (struct _st_heap_control) + \
        !           119:                (segs) * (2 * sizeof (_ST_WORD_T) + sizeof (_ST_ADDR_T)))
        !           120: 
        !           121: /*
        !           122:  * Allocation control block. This block is normally followed by vectors
        !           123:  * containing a maximum block size heap and a vector defining the first free
        !           124:  * block in an allocation bucket.
        !           125:  */
        !           126: 
        !           127: struct _st_heap_control {
        !           128: 
        !           129:        int             _buckets_inuse;         /* number of active buckets */
        !           130:        int             _buckets_maximum;       /* maximum possible buckets */
        !           131:        int             _words_per_bucket;      /* memory words per bucket */
        !           132:        size_t          _arena_size;            /* total bytes in arena */
        !           133: 
        !           134:        _ST_WORD_T    * _bucket_biggest;        /* bucket size ordered heap */
        !           135:        _ST_ADDR_T    * _bucket_first;          /* address of first block */
        !           136:        _ST_ADDR_T      _arena_base;
        !           137:                                                /*
        !           138:                                                 * base address of the first
        !           139:                                                 * word in the arena, same as
        !           140:                                                 * _bucket_first [0]
        !           141:                                                 */
        !           142:        _ST_ADDR_T      _arena_end;
        !           143:                                                /*
        !           144:                                                 * Address of last word in
        !           145:                                                 * the arena +1
        !           146:                                                 */
        !           147:        __CONST__ char * _heap_error;
        !           148:                                                /*
        !           149:                                                 * If this heap is corrupt,
        !           150:                                                 * points to a string that
        !           151:                                                 * describes the problem
        !           152:                                                 */
        !           153: };
        !           154: 
        !           155: typedef struct _st_heap_control _ST_HEAP_CONTROL, * _ST_HEAP_CONTROL_P;
        !           156: 
        !           157: 
        !           158: /*
        !           159:  * As an additional check, we can make clients of st_disp () pass in the
        !           160:  * size of the block to free as (i) an additional assertion check against
        !           161:  * bugs, and (ii) because a faster/less overhead implementation of the
        !           162:  * algorithm might be possible where there is no header for allocated blocks
        !           163:  * (the free blocks contain a size and a pointer to the next free block).
        !           164:  */
        !           165: 
        !           166: #define        USE_ST_SIZE
        !           167: 
        !           168: #ifdef USE_ST_SIZE
        !           169: #define        ST_FREE_SIZE(x)         , x
        !           170: #else
        !           171: #define        ST_FREE_SIZE(x)
        !           172: #endif
        !           173: 
        !           174: 
        !           175: /*
        !           176:  * Public function prototypes
        !           177:  */
        !           178: 
        !           179: __EXTERN_C_BEGIN__
        !           180: 
        !           181: int            st_assert       __PROTO ((_ST_HEAP_CONTROL_P _q));
        !           182: __VOID__      *        st_alloc        __PROTO ((_ST_HEAP_CONTROL_P _q,
        !           183:                                          size_t _size));
        !           184: int            st_free         __PROTO ((_ST_HEAP_CONTROL_P _q,
        !           185:                                          __VOID__ * _a
        !           186:                                          ST_FREE_SIZE (size_t _size)));
        !           187: __VOID__      *        st_realloc      __PROTO ((_ST_HEAP_CONTROL_P _q,
        !           188:                                          __VOID__ * _a, size_t _newsize
        !           189:                                          ST_FREE_SIZE (size_t _oldsize)));
        !           190: void           st_init         __PROTO ((_ST_HEAP_CONTROL_P _q));
        !           191: void           st_ctor         __PROTO ((_ST_HEAP_CONTROL_P _q, int _segs,
        !           192:                                          size_t _arensize,
        !           193:                                          _ST_ADDR_T _arenabase));
        !           194: size_t         st_maxavail     __PROTO ((_ST_HEAP_CONTROL_P _q));
        !           195: 
        !           196: __EXTERN_C_END__
        !           197: 
        !           198: #endif /* ! defined (__KERNEL_ST_ALLOC_H__) */

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.