diff options
| author | Robert Morris <rtm@csail.mit.edu> | 2019-06-11 09:57:14 -0400 |
|---|---|---|
| committer | Robert Morris <rtm@csail.mit.edu> | 2019-06-11 09:57:14 -0400 |
| commit | 5753553213df8f9de851adb68377db43faecb91f (patch) | |
| tree | 3b629ff54897fca414146677532cb459a2ed11ba /umalloc.c | |
| parent | 91ba81110acd3163f7de3580b677eece0c57f5e7 (diff) | |
| download | xv6-labs-2022-5753553213df8f9de851adb68377db43faecb91f.tar.xz xv6-labs-2022-5753553213df8f9de851adb68377db43faecb91f.zip | |
separate source into kernel/ user/ mkfs/
Diffstat (limited to 'umalloc.c')
| -rw-r--r-- | umalloc.c | 90 |
1 files changed, 0 insertions, 90 deletions
diff --git a/umalloc.c b/umalloc.c deleted file mode 100644 index a7e7d2c..0000000 --- a/umalloc.c +++ /dev/null @@ -1,90 +0,0 @@ -#include "types.h" -#include "stat.h" -#include "user.h" -#include "param.h" - -// Memory allocator by Kernighan and Ritchie, -// The C programming Language, 2nd ed. Section 8.7. - -typedef long Align; - -union header { - struct { - union header *ptr; - uint size; - } s; - Align x; -}; - -typedef union header Header; - -static Header base; -static Header *freep; - -void -free(void *ap) -{ - Header *bp, *p; - - bp = (Header*)ap - 1; - for(p = freep; !(bp > p && bp < p->s.ptr); p = p->s.ptr) - if(p >= p->s.ptr && (bp > p || bp < p->s.ptr)) - break; - if(bp + bp->s.size == p->s.ptr){ - 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){ - p->s.size += bp->s.size; - p->s.ptr = bp->s.ptr; - } else - p->s.ptr = bp; - freep = p; -} - -static Header* -morecore(uint nu) -{ - char *p; - Header *hp; - - if(nu < 4096) - nu = 4096; - p = sbrk(nu * sizeof(Header)); - if(p == (char*)-1) - return 0; - hp = (Header*)p; - hp->s.size = nu; - free((void*)(hp + 1)); - return freep; -} - -void* -malloc(uint nbytes) -{ - Header *p, *prevp; - uint nunits; - - nunits = (nbytes + sizeof(Header) - 1)/sizeof(Header) + 1; - if((prevp = freep) == 0){ - 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){ - if(p->s.size == nunits) - prevp->s.ptr = p->s.ptr; - else { - p->s.size -= nunits; - p += p->s.size; - p->s.size = nunits; - } - freep = prevp; - return (void*)(p + 1); - } - if(p == freep) - if((p = morecore(nunits)) == 0) - return 0; - } -} |
