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

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

unix.superglobalmegacorp.com

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