Annotation of 43BSDTahoe/sys/h/malloc.h, revision 1.1

1.1     ! root        1: /*
        !             2:  * Copyright (c) 1987 Regents of the University of California.
        !             3:  * All rights reserved.
        !             4:  *
        !             5:  * Redistribution and use in source and binary forms are permitted
        !             6:  * provided that the above copyright notice and this paragraph are
        !             7:  * duplicated in all such forms and that any documentation,
        !             8:  * advertising materials, and other materials related to such
        !             9:  * distribution and use acknowledge that the software was developed
        !            10:  * by the University of California, Berkeley.  The name of the
        !            11:  * University may not be used to endorse or promote products derived
        !            12:  * from this software without specific prior written permission.
        !            13:  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
        !            14:  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
        !            15:  * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
        !            16:  *
        !            17:  *     @(#)malloc.h    7.7 (Berkeley) 6/27/88
        !            18:  */
        !            19: 
        !            20: #define KMEMSTATS
        !            21: 
        !            22: /*
        !            23:  * flags to malloc
        !            24:  */
        !            25: #define M_WAITOK       0x0000
        !            26: #define M_NOWAIT       0x0001
        !            27: 
        !            28: /*
        !            29:  * Types of memory to be allocated
        !            30:  */
        !            31: #define        M_FREE          0       /* should be on free list */
        !            32: #define M_MBUF         1       /* mbuf */
        !            33: #define M_DEVBUF       2       /* device driver memory */
        !            34: #define        M_SOCKET        3       /* socket structure */
        !            35: #define        M_PCB           4       /* protocol control block */
        !            36: #define        M_RTABLE        5       /* routing tables */
        !            37: #define        M_HTABLE        6       /* IMP host tables */
        !            38: #define        M_FTABLE        7       /* fragment reassembly header */
        !            39: #define        M_ZOMBIE        8       /* zombie proc status */
        !            40: #define        M_IFADDR        9       /* interface address */
        !            41: #define        M_SOOPTS        10      /* socket options */
        !            42: #define        M_SONAME        11      /* socket name */
        !            43: #define M_NAMEI                12      /* namei path name buffer */
        !            44: #define M_GPROF                13      /* kernel profiling buffer */
        !            45: #define M_IOCTLOPS     14      /* ioctl data buffer */
        !            46: #define M_SUPERBLK     15      /* super block data */
        !            47: #define M_CRED         16      /* credentials */
        !            48: #define M_TEMP         49      /* misc temporary data buffers */
        !            49: #define M_LAST         50
        !            50: 
        !            51: struct kmemstats {
        !            52:        long    ks_inuse;       /* # of packets of this type currently in use */
        !            53:        long    ks_calls;       /* total packets of this type ever allocated */
        !            54:        long    ks_memuse;      /* total memory held in bytes */
        !            55:        u_short ks_limblocks;   /* number of times blocked for hitting limit */
        !            56:        u_short ks_mapblocks;   /* number of times blocked for kernel map */
        !            57:        long    ks_maxused;     /* maximum number ever used */
        !            58:        long    ks_limit;       /* most that are allowed to exist */
        !            59: };
        !            60: 
        !            61: /*
        !            62:  * Array of descriptors that describe the contents of each page
        !            63:  */
        !            64: struct kmemusage {
        !            65:        short ku_indx;          /* bucket index */
        !            66:        union {
        !            67:                u_short freecnt;/* for small allocations, free pieces in page */
        !            68:                u_short pagecnt;/* for large allocations, pages alloced */
        !            69:        } ku_un;
        !            70: };
        !            71: #define ku_freecnt ku_un.freecnt
        !            72: #define ku_pagecnt ku_un.pagecnt
        !            73: 
        !            74: /*
        !            75:  * Set of buckets for each size of memory block that is retained
        !            76:  */
        !            77: struct kmembuckets {
        !            78:        caddr_t kb_next;        /* list of free blocks */
        !            79:        long    kb_calls;       /* total calls to allocate this size */
        !            80:        long    kb_total;       /* total number of blocks allocated */
        !            81:        long    kb_totalfree;   /* # of free elements in this bucket */
        !            82:        long    kb_elmpercl;    /* # of elements in this sized allocation */
        !            83:        long    kb_highwat;     /* high water mark */
        !            84:        long    kb_couldfree;   /* over high water mark and could free */
        !            85: };
        !            86: 
        !            87: #ifdef KERNEL
        !            88: #define MINALLOCSIZE   (1 << MINBUCKET)
        !            89: #define BUCKETINDX(size) \
        !            90:        (size) <= (MINALLOCSIZE * 128) \
        !            91:                ? (size) <= (MINALLOCSIZE * 8) \
        !            92:                        ? (size) <= (MINALLOCSIZE * 2) \
        !            93:                                ? (size) <= (MINALLOCSIZE * 1) \
        !            94:                                        ? (MINBUCKET + 0) \
        !            95:                                        : (MINBUCKET + 1) \
        !            96:                                : (size) <= (MINALLOCSIZE * 4) \
        !            97:                                        ? (MINBUCKET + 2) \
        !            98:                                        : (MINBUCKET + 3) \
        !            99:                        : (size) <= (MINALLOCSIZE* 32) \
        !           100:                                ? (size) <= (MINALLOCSIZE * 16) \
        !           101:                                        ? (MINBUCKET + 4) \
        !           102:                                        : (MINBUCKET + 5) \
        !           103:                                : (size) <= (MINALLOCSIZE * 64) \
        !           104:                                        ? (MINBUCKET + 6) \
        !           105:                                        : (MINBUCKET + 7) \
        !           106:                : (size) <= (MINALLOCSIZE * 2048) \
        !           107:                        ? (size) <= (MINALLOCSIZE * 512) \
        !           108:                                ? (size) <= (MINALLOCSIZE * 256) \
        !           109:                                        ? (MINBUCKET + 8) \
        !           110:                                        : (MINBUCKET + 9) \
        !           111:                                : (size) <= (MINALLOCSIZE * 1024) \
        !           112:                                        ? (MINBUCKET + 10) \
        !           113:                                        : (MINBUCKET + 11) \
        !           114:                        : (size) <= (MINALLOCSIZE * 8192) \
        !           115:                                ? (size) <= (MINALLOCSIZE * 4096) \
        !           116:                                        ? (MINBUCKET + 12) \
        !           117:                                        : (MINBUCKET + 13) \
        !           118:                                : (size) <= (MINALLOCSIZE * 16384) \
        !           119:                                        ? (MINBUCKET + 14) \
        !           120:                                        : (MINBUCKET + 15)
        !           121: 
        !           122: /*
        !           123:  * Turn virtual addresses into kmem map indicies
        !           124:  */
        !           125: #define kmemxtob(alloc)        (kmembase + (alloc) * NBPG)
        !           126: #define btokmemx(addr) (((caddr_t)(addr) - kmembase) / NBPG)
        !           127: #define btokup(addr)   (&kmemusage[((caddr_t)(addr) - kmembase) >> CLSHIFT])
        !           128: 
        !           129: /*
        !           130:  * Macro versions for the usual cases of malloc/free
        !           131:  */
        !           132: #ifdef KMEMSTATS
        !           133: #define MALLOC(space, cast, size, type, flags) \
        !           134:        (space) = (cast)malloc((u_long)(size), type, flags)
        !           135: #define FREE(addr, type) free((caddr_t)(addr), type)
        !           136: 
        !           137: #else /* do not collect statistics */
        !           138: #define MALLOC(space, cast, size, type, flags) { \
        !           139:        register struct kmembuckets *kbp = &bucket[BUCKETINDX(size)]; \
        !           140:        long s = splimp(); \
        !           141:        if (kbp->kb_next == NULL) { \
        !           142:                (space) = (cast)malloc((u_long)(size), type, flags); \
        !           143:        } else { \
        !           144:                (space) = (cast)kbp->kb_next; \
        !           145:                kbp->kb_next = *(caddr_t *)(space); \
        !           146:        } \
        !           147:        splx(s); \
        !           148: }
        !           149: 
        !           150: #define FREE(addr, type) { \
        !           151:        register struct kmembuckets *kbp; \
        !           152:        register struct kmemusage *kup = btokup(addr); \
        !           153:        long s = splimp(); \
        !           154:        if (1 << kup->ku_indx > MAXALLOCSAVE) { \
        !           155:                free((caddr_t)(addr), type); \
        !           156:        } else { \
        !           157:                kbp = &bucket[kup->ku_indx]; \
        !           158:                *(caddr_t *)(addr) = kbp->kb_next; \
        !           159:                kbp->kb_next = (caddr_t)(addr); \
        !           160:        } \
        !           161:        splx(s); \
        !           162: }
        !           163: #endif /* do not collect statistics */
        !           164: 
        !           165: extern struct kmemstats kmemstats[];
        !           166: extern struct kmemusage *kmemusage;
        !           167: extern char kmembase[];
        !           168: extern struct kmembuckets bucket[];
        !           169: extern qaddr_t malloc();
        !           170: extern void free();
        !           171: #endif KERNEL

unix.superglobalmegacorp.com

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