vm_zone.h
来自「基于组件方式开发操作系统的OSKIT源代码」· C头文件 代码 · 共 134 行
H
134 行
/* * Copyright (c) 1997, 1998 John S. Dyson * 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 immediately at the beginning of the file, without modification, * this list of conditions, and the following disclaimer. * 2. Absolutely no warranty of function or purpose is made by the author * John S. Dyson. * * $Id: vm_zone.h,v 1.12 1999/01/10 01:58:29 eivind Exp $ */#ifndef _SYS_ZONE_H#define _SYS_ZONE_H#define ZONE_INTERRUPT 1 /* Use this if you need to allocate at int time */#define ZONE_BOOT 16 /* This is an internal flag used by zbootinit */#include <machine/lock.h>typedef struct vm_zone { struct simplelock zlock; /* lock for data structure */ void *zitems; /* linked list of items */ int zfreecnt; /* free entries */ int zfreemin; /* minimum number of free entries */ int znalloc; /* number of allocations */ vm_offset_t zkva; /* Base kva of zone */ int zpagecount; /* Total # of allocated pages */ int zpagemax; /* Max address space */ int zmax; /* Max number of entries allocated */ int ztotal; /* Total entries allocated now */ int zsize; /* size of each entry */ int zalloc; /* hint for # of pages to alloc */ int zflags; /* flags for zone */ int zallocflag; /* flag for allocation */ struct vm_object *zobj; /* object to hold zone */ char *zname; /* name for diags */ struct vm_zone *znext; /* list of zones for sysctl */} *vm_zone_t;void zerror __P((int)) __dead2;vm_zone_t zinit __P((char *name, int size, int nentries, int flags, int zalloc));int zinitna __P((vm_zone_t z, struct vm_object *obj, char *name, int size, int nentries, int flags, int zalloc));static void * zalloc __P((vm_zone_t z));static void zfree __P((vm_zone_t z, void *item));void * zalloci __P((vm_zone_t z));void zfreei __P((vm_zone_t z, void *item));void zbootinit __P((vm_zone_t z, char *name, int size, void *item, int nitems));void * _zget __P((vm_zone_t z));#define ZONE_ERROR_INVALID 0#define ZONE_ERROR_NOTFREE 1#define ZONE_ERROR_ALREADYFREE 2#define ZONE_ROUNDING 32#define ZENTRY_FREE 0x12342378/* * void *zalloc(vm_zone_t zone) -- * Returns an item from a specified zone. * * void zfree(vm_zone_t zone, void *item) -- * Frees an item back to a specified zone. */static __inline__ void *_zalloc(vm_zone_t z){ void *item;#ifdef INVARIANTS if (z == 0) zerror(ZONE_ERROR_INVALID);#endif if (z->zfreecnt <= z->zfreemin) return _zget(z); item = z->zitems; z->zitems = ((void **) item)[0];#ifdef INVARIANTS if (((void **) item)[1] != (void *) ZENTRY_FREE) zerror(ZONE_ERROR_NOTFREE); ((void **) item)[1] = 0;#endif z->zfreecnt--; z->znalloc++; return item;}static __inline__ void_zfree(vm_zone_t z, void *item){ ((void **) item)[0] = z->zitems;#ifdef INVARIANTS if (((void **) item)[1] == (void *) ZENTRY_FREE) zerror(ZONE_ERROR_ALREADYFREE); ((void **) item)[1] = (void *) ZENTRY_FREE;#endif z->zitems = item; z->zfreecnt++;}static __inline__ void *zalloc(vm_zone_t z){#if defined(SMP) return zalloci(z);#else return _zalloc(z);#endif}static __inline__ voidzfree(vm_zone_t z, void *item){#ifdef SMP zfreei(z, item);#else _zfree(z, item);#endif}#endif
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?