malloc.h
来自「基于组件方式开发操作系统的OSKIT源代码」· C头文件 代码 · 共 239 行
H
239 行
/* * Copyright (c) 1987, 1993 * The Regents of the University of California. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software * must display the following acknowledgement: * This product includes software developed by the University of * California, Berkeley and its contributors. * 4. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * @(#)malloc.h 8.5 (Berkeley) 5/3/95 * $Id: malloc.h,v 1.38 1998/11/10 08:46:24 peter Exp $ */#ifndef _SYS_MALLOC_H_#define _SYS_MALLOC_H_#define splmem splhigh#ifndef OSKIT/* * XXX Since our kmem_malloc tweaks kmembase and kmemusage, it's * probably best just not to define KMEMSTATS. */#define KMEMSTATS#endif/* * flags to malloc */#define M_WAITOK 0x0000#define M_NOWAIT 0x0001#define M_KERNEL 0x0002#define M_MAGIC 877983977 /* time when first defined :-) */struct malloc_type { struct malloc_type *ks_next; /* next in list */ long ks_memuse; /* total memory held in bytes */ long ks_limit; /* most that are allowed to exist */ long ks_size; /* sizes of this thing that are allocated */ long ks_inuse; /* # of packets of this type currently in use */ long ks_calls; /* total packets of this type ever allocated */ long ks_maxused; /* maximum number ever used */ u_long ks_magic; /* if it's not magic, don't touch it */ const char *ks_shortdesc; /* short description */ u_short ks_limblocks; /* number of times blocked for hitting limit */ u_short ks_mapblocks; /* number of times blocked for kernel map */};#ifdef KERNELvoid malloc_init __P((void *));void malloc_uninit __P((void *));#ifdef OSKIT#define MALLOC_DEFINE(type, shortdesc, longdesc) \ struct malloc_type type[1] = { \ { NULL, 0, 0, 0, 0, 0, 0, M_MAGIC, shortdesc, 0, 0 } \ }; #else#define MALLOC_DEFINE(type, shortdesc, longdesc) \ struct malloc_type type[1] = { \ { NULL, 0, 0, 0, 0, 0, 0, M_MAGIC, shortdesc, 0, 0 } \ }; \ SYSINIT(type##_init, SI_SUB_KMEM, SI_ORDER_ANY, malloc_init, type); \ SYSUNINIT(type##_uninit, SI_SUB_KMEM, SI_ORDER_ANY, malloc_uninit, type)#endif /* !OSKIT */#define MALLOC_DECLARE(type) \ extern struct malloc_type type[1]#ifdef MALLOC_INSTANTIATE#define MALLOC_MAKE_TYPE(type, shortdesc, longdesc) \ MALLOC_DEFINE(type, shortdesc, longdesc)#else#define MALLOC_MAKE_TYPE(type, shortdesc, longdesc) \ MALLOC_DECLARE(type)#endifMALLOC_MAKE_TYPE(M_CACHE, "namecache", "Dynamically allocated cache entries");MALLOC_MAKE_TYPE(M_DEVBUF, "devbuf", "device driver memory");MALLOC_MAKE_TYPE(M_TEMP, "temp", "misc temporary data buffers");#endif /* KERNEL *//* * Array of descriptors that describe the contents of each page */struct kmemusage { short ku_indx; /* bucket index */ union { u_short freecnt;/* for small allocations, free pieces in page */ u_short pagecnt;/* for large allocations, pages alloced */ } ku_un;};#define ku_freecnt ku_un.freecnt#define ku_pagecnt ku_un.pagecnt/* * Set of buckets for each size of memory block that is retained */struct kmembuckets { caddr_t kb_next; /* list of free blocks */ caddr_t kb_last; /* last free block */ long kb_total; /* total number of blocks allocated */ long kb_elmpercl; /* # of elements in this sized allocation */ long kb_totalfree; /* # of free elements in this bucket */ long kb_calls; /* total calls to allocate this size */ long kb_highwat; /* high water mark */ long kb_couldfree; /* over high water mark and could free */};#ifdef KERNEL#define MINALLOCSIZE (1 << MINBUCKET)#define BUCKETINDX(size) \ ((size) <= (MINALLOCSIZE * 128) \ ? (size) <= (MINALLOCSIZE * 8) \ ? (size) <= (MINALLOCSIZE * 2) \ ? (size) <= (MINALLOCSIZE * 1) \ ? (MINBUCKET + 0) \ : (MINBUCKET + 1) \ : (size) <= (MINALLOCSIZE * 4) \ ? (MINBUCKET + 2) \ : (MINBUCKET + 3) \ : (size) <= (MINALLOCSIZE* 32) \ ? (size) <= (MINALLOCSIZE * 16) \ ? (MINBUCKET + 4) \ : (MINBUCKET + 5) \ : (size) <= (MINALLOCSIZE * 64) \ ? (MINBUCKET + 6) \ : (MINBUCKET + 7) \ : (size) <= (MINALLOCSIZE * 2048) \ ? (size) <= (MINALLOCSIZE * 512) \ ? (size) <= (MINALLOCSIZE * 256) \ ? (MINBUCKET + 8) \ : (MINBUCKET + 9) \ : (size) <= (MINALLOCSIZE * 1024) \ ? (MINBUCKET + 10) \ : (MINBUCKET + 11) \ : (size) <= (MINALLOCSIZE * 8192) \ ? (size) <= (MINALLOCSIZE * 4096) \ ? (MINBUCKET + 12) \ : (MINBUCKET + 13) \ : (size) <= (MINALLOCSIZE * 16384) \ ? (MINBUCKET + 14) \ : (MINBUCKET + 15))/* * Turn virtual addresses into kmem map indices */#define kmemxtob(alloc) (kmembase + (alloc) * PAGE_SIZE)#define btokmemx(addr) (((caddr_t)(addr) - kmembase) / PAGE_SIZE)#define btokup(addr) (&kmemusage[(caddr_t)(addr) - kmembase >> PAGE_SHIFT])/* * Macro versions for the usual cases of malloc/free */#if defined(KMEMSTATS) || defined(DIAGNOSTIC) || defined(OSKIT)#define MALLOC(space, cast, size, type, flags) \ (space) = (cast)malloc((u_long)(size), type, flags)#define FREE(addr, type) free((addr), type)#else /* do not collect statistics */#define MALLOC(space, cast, size, type, flags) do { \ register struct kmembuckets *kbp = &bucket[BUCKETINDX(size)]; \ long s = splmem(); \ if (kbp->kb_next == NULL) { \ (space) = (cast)malloc((u_long)(size), type, flags); \ } else { \ (space) = (cast)kbp->kb_next; \ kbp->kb_next = *(caddr_t *)(space); \ } \ splx(s); \} while (0)#define FREE(addr, type) do { \ register struct kmembuckets *kbp; \ register struct kmemusage *kup = btokup(addr); \ long s = splmem(); \ if (1 << kup->ku_indx > MAXALLOCSAVE) { \ free((addr), type); \ } else { \ kbp = &bucket[kup->ku_indx]; \ if (kbp->kb_next == NULL) \ kbp->kb_next = (caddr_t)(addr); \ else \ *(caddr_t *)(kbp->kb_last) = (caddr_t)(addr); \ *(caddr_t *)(addr) = NULL; \ kbp->kb_last = (caddr_t)(addr); \ } \ splx(s); \} while (0)extern struct kmemusage *kmemusage;extern char *kmembase;extern struct kmembuckets bucket[];#endif /* do not collect statistics *//* * XXX this should be declared in <sys/uio.h>, but that tends to fail * because <sys/uio.h> is included in a header before the source file * has a chance to include <sys/malloc.h> to get MALLOC_DECLARE() defined. */MALLOC_DECLARE(M_IOV);void *contigmalloc __P((unsigned long size, struct malloc_type *type, int flags, unsigned long low, unsigned long high, unsigned long alignment, unsigned long boundary));void free __P((void *addr, struct malloc_type *type));void *malloc __P((unsigned long size, struct malloc_type *type, int flags));#endif /* KERNEL */#endif /* !_SYS_MALLOC_H_ */
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?