Annotation of researchv10no/cmd/twig/mem.c, revision 1.1.1.1

1.1       root        1: #include <stdio.h>
                      2: #include <assert.h>
                      3: #include "mem.h"
                      4: 
                      5: #define BLKF    100
                      6: 
                      7: static struct _mem *mlist;
                      8: 
                      9: static void
                     10: zap(cp,size)
                     11:         char *cp;
                     12:         int size;
                     13: {
                     14:         for(;size>0;size--) {
                     15:                 *cp = 0xff;
                     16:         }
                     17: }
                     18: void
                     19: mem_init(mp, size)
                     20:         struct _mem *mp;
                     21:         int size;
                     22: {
                     23:         int i, s;
                     24:         assert(size>=4);
                     25:         mp->size = s = size;
                     26:         s *= BLKF;
                     27:         for (i=1; i < s; i <<= 1);
                     28:         mp->bsize = i;
                     29:         mp->blkf = mp->bsize/size;
                     30:         mp->cnt = 0;
                     31:         mp->freelist = NULL;
                     32:         mp->totelem = 0;
                     33:         mp->freecnt = 0;
                     34:         mp->next = mlist;
                     35:         mlist = mp;
                     36: };
                     37: 
                     38: char *
                     39: mem_get(mp)
                     40:         struct _mem *mp;
                     41: {
                     42:         char *cp;
                     43:         if (mp->freelist!=NULL) {
                     44:                 cp = mp->freelist;
                     45:                 mp->freelist = *(char **) cp;
                     46:                 mp->freecnt--;
                     47:                 zap(cp,mp->size);
                     48:                 return(cp);
                     49:         } else if (mp->cnt==0) {
                     50:                 mp->block = (char *)malloc(mp->bsize);
                     51:                 mp->cnt = mp->blkf;
                     52:                 mp->totelem += mp->blkf;
                     53:         }
                     54:         mp->cnt--;
                     55:         cp = mp->block;
                     56:         mp->block += mp->size;
                     57:         zap(cp,mp->size);
                     58:         return(cp);
                     59: }
                     60:                 
                     61: mem_free(mp, cp)
                     62:         struct _mem *mp;
                     63:         char *cp;{
                     64:         *(char **)cp = mp->freelist;
                     65:         mp->freelist = cp;
                     66:         mp->freecnt++;
                     67: }
                     68: 
                     69: mem_outstanding(mp)
                     70:         struct _mem *mp;
                     71: {
                     72:         /* returns elements that are outstanding..i.e. asked for
                     73:          * but haven't yet been returned
                     74:          */
                     75:         return(mp->totelem - (mp->cnt+mp->freecnt));
                     76: }
                     77: 
                     78: mem_epilogue()
                     79: {
                     80:         struct _mem *mp;
                     81:         /*
                     82:          * if the following assertion fails then one of the following
                     83:          * has happened:
                     84:          * 1) somebody forgot to free something or
                     85:          * 2) there is leakage.
                     86:          */
                     87:         for(mp=mlist; mp!=NULL; mp = mp->next) {
                     88:                 assert(mem_outstanding(mp)==0);
                     89:         }
                     90: }

unix.superglobalmegacorp.com

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