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