#include //K&R Chapt5, Section 4 #if 0 #define ALLOCSIZE 10000 static char allocbuf[ALLOCSIZE]; /*storage for alloc*/ static char *allocp = allocbuf; /*next free position*/ char *alloc(int n) { if(allocbuf+ALLOCSIZE - allocp >= n) { allocp += n; return alloc - n; } else return 0; } void afree(char *p) { if (p >= allocbuf && ps.size); for(p=freep;!(bp>p && bp< p->s.ptr);p=p->s.ptr) if(p>=p->s.ptr && (bp>p || bps.ptr)) break; /* freed block at start or end of arena*/ if (bp+bp->s.size==p->s.ptr) { /* join to upper nbr */ bp->s.size += p->s.ptr->s.size; bp->s.ptr = p->s.ptr->s.ptr; } else bp->s.ptr = p->s.ptr; if (p+p->s.size == bp) { /* join to lower nbr */ p->s.size += bp->s.size; p->s.ptr = bp->s.ptr; } else p->s.ptr = bp; freep = p; } #define NALLOC 1024 /* minimum #units to request */ static Header *morecore(unsigned nu) { char *cp; Header *up; if(nu < NALLOC) nu = NALLOC; cp = sbrk(nu * sizeof(Header)); printf("morecore: cp 0x%x, size %d\n",cp,nu * sizeof(Header)); if(cp == (char *)-1) /* no space at all*/ return NULL; up = (Header *)cp; up->s.size = nu; kr_free((void *)(up+1)); return freep; } void *kr_malloc(unsigned nbytes) { Header *p, *prevp; unsigned nunits; nunits = (nbytes+sizeof(Header)-1)/sizeof(Header) + 1; printf("kr_malloc: nbytes %d, nunits %d\n",nbytes,nunits); if((prevp = freep) == NULL) { /* no free list */ base.s.ptr = freep = prevp = &base; base.s.size = 0; } for(p = prevp->s.ptr; ;prevp = p, p= p->s.ptr) { if(p->s.size >= nunits) { /* big enough */ if (p->s.size == nunits) /* exactly */ prevp->s.ptr = p->s.ptr; else { p->s.size -= nunits; p += p->s.size; p->s.size = nunits; } freep = prevp; printf("kr_malloc: p 0x%x, size %d\n",p,p->s.size); return (void*)(p+1); } if (p== freep) /* wrapped around free list */ if ((p = morecore(nunits)) == NULL) { printf("kr_malloc: no free space!!!\n"); return NULL; /* none left */ } } } void kr_dump(void) { static int i=0; Header *p, *prevp; prevp = freep; i++; for(p = prevp->s.ptr; ;prevp = p, p= p->s.ptr) { if(p== freep) { return; } printf("kr_dump: %d: p 0x%x, size %d\n", i, p, p->s.size); } } void main(void) { void * na,*nb,*nc,*nd,*ne, *nf; printf("size of Header is %d\n", sizeof(Header)); na=kr_malloc(16); kr_dump(); kr_free(na); kr_dump(); nb=kr_malloc(48); kr_dump(); nc=kr_malloc(60); kr_dump(); nd=kr_malloc(128); kr_dump(); kr_free(nb); kr_dump(); ne=kr_malloc(512); kr_dump(); kr_free(nd); kr_dump(); nf=kr_malloc(256); kr_dump(); kr_free(nc); kr_dump(); kr_free(nf); kr_dump(); kr_free(ne); kr_dump(); }