Annotation of xinu/sys/getmem.c, revision 1.1.1.1

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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.