📄 alloc.c
字号:
/*alloc.c: 对内存进行分配管理*/#include "cmm.h"#include "alloc.h"struct block { struct block *next; char *limit; char *avail;};union align { int i; char *p; void (*func)(void);};union header{ struct block b; union align a;};static struct block first[] = { {NULL}, {NULL}, {NULL}},*arena[3] = {&first[0], &first[1],&first[2]};static struct block *freeblock;void *allocate(unsigned long n, unsigned a){ struct block *ap; assert(n > 0); assert(a >= 0 && a < NELEMS(arena)); ap = arena[a]; n = roundup(n, sizeof(union align)); while(n > ap->limit - ap->avail) { if ( (ap->next = freeblock) != NULL) { ap = ap->next; freeblock = freeblock->next; }else { unsigned long m = n + sizeof(union header) + 10 * 1024; ap->next = malloc(m); if (ap->next == NULL) { error("memory allocate fail"); exit(1); } ap = ap->next; ap->limit = (char *) ap + m; } ap->next = NULL; ap->avail = (char *)((union header *)ap + 1); } arena[a] = ap; ap->avail += n; return ap->avail - n;}void deallocate(unsigned a){ assert(a >= 0 && a < NELEMS(arena)); arena[a]->next = freeblock; freeblock = first[a].next; first[a].next = NULL; arena[a] = &first[a];}void dispose(void){ struct block *b,*next; for(b = freeblock; b != NULL; b = next) { next = b->next; free(b); } freeblock = NULL;}void *newarray(unsigned m, unsigned n, unsigned a){ return allocate( m*n, a);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -