|
|
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.