|
|
1.1 ! root 1: /* getmem.c - getmem */ ! 2: ! 3: #include <conf.h> ! 4: #include <kernel.h> ! 5: #include <mem.h> ! 6: ! 7: /*------------------------------------------------------------------------ ! 8: * getmem -- allocate heap storage, returning lowest integer address ! 9: *------------------------------------------------------------------------ ! 10: */ ! 11: SYSCALL *getmem(nbytes) ! 12: unsigned nbytes; ! 13: { ! 14: PStype ps; ! 15: struct mblock *p, *q, *leftover; ! 16: ! 17: disable(ps); ! 18: if (nbytes<=0 || (char *)memlist.mnext==NULL) { ! 19: restore(ps); ! 20: return( (int *)SYSERR); ! 21: } ! 22: nbytes = (unsigned) roundew(nbytes); ! 23: for (q= &memlist,p=memlist.mnext ; (char *)p!=NULL ; q=p,p=p->mnext) ! 24: if ( p->mlen == nbytes) { ! 25: q->mnext = p->mnext; ! 26: restore(ps); ! 27: return( (int *)p ); ! 28: } else if ( p->mlen > nbytes ) { ! 29: leftover = (struct mblock *)( (unsigned)p + nbytes ); ! 30: q->mnext = leftover; ! 31: leftover->mnext = p->mnext; ! 32: leftover->mlen = p->mlen - nbytes; ! 33: restore(ps); ! 34: return( (int *)p ); ! 35: } ! 36: restore(ps); ! 37: return( (int *)SYSERR ); ! 38: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.