Annotation of researchv10no/cmd/trace/malloc_t.c, revision 1.1.1.1

1.1       root        1: #include <stdio.h>
                      2: #include "trace.h"
                      3: 
                      4: #define DEBUG  0
                      5: 
                      6: #if DEBUG
                      7: #define log(e, u, d)   event[e][u] += (long) d;
                      8: #else
                      9: #define log(e, u, d)
                     10: #endif
                     11: 
                     12: #define A_LARGE 64
                     13: #define A_USER 0x55000000
                     14: 
                     15: #define POOL   0
                     16: #define ALLOC  1
                     17: #define FREE   2
                     18: #define NREVENT        3
                     19: 
                     20:  union M {
                     21:        long size;
                     22:        union M *link;
                     23:  };
                     24: 
                     25:  union M *freelist[A_LARGE];
                     26:  long   req[A_LARGE];
                     27:  long   event[NREVENT][A_LARGE];
                     28: 
                     29: char *
                     30: talloc(u)
                     31:        long u;
                     32: { union M *m;
                     33:   register r;
                     34:   char *Smalloc();
                     35: 
                     36:        u = ((u-1)/sizeof(union M) + 2);
                     37: 
                     38:        if( u >= A_LARGE )
                     39:        {       log(ALLOC, 0, (long) 1);
                     40:                m = (union M *) malloc( u * sizeof(union M) );
                     41:                if (m == NULL)
                     42:                        whoops("malloc fault");
                     43:        } else
                     44:        {       if( freelist[u] == NULL )
                     45:                {       r = req[u] += req[u] ? req[u] : 1;
                     46:                        if (r > NOTOOBIG)
                     47:                                r = req[u] = NOTOOBIG+1;
                     48:                        log(POOL, (int) u, (long) r);
                     49:                        freelist[u] = (union M *) Smalloc( r*u*sizeof(union M) );
                     50:                        if (freelist[u] == NULL)
                     51:                                whoops("malloc fault");
                     52: 
                     53:                        (freelist[u] + u*(r-1))->link = 0;
                     54:                        for (m = freelist[u] + u*(r-2); m >= freelist[u]; m -= u)
                     55:                                        m->link = m+u;
                     56:                }
                     57:                log(ALLOC, (int) u, (long) 1);
                     58: 
                     59:                m = freelist[u];
                     60:                freelist[u] = m->link;
                     61:        }
                     62:        m->size = u | A_USER;
                     63: /*
                     64:        for (r = 1; r < u; )
                     65:                (&m->size)[r++] = 0;
                     66: */
                     67:        return (char *) (m+1);
                     68: }
                     69: 
                     70: tfree(v)
                     71:        char *v;
                     72: { register union M *m = (union M *) v;
                     73:   register long u;
                     74: 
                     75:        --m;
                     76:        if ( (m->size&0xFF000000) != A_USER)
                     77:        {       fprintf(stderr, "panic: releasing a free block\n");
                     78:                kill(getpid(), 3);
                     79:        }
                     80: 
                     81:        u = (m->size &= 0xFFFFFF);
                     82:        if ( u >= A_LARGE )
                     83:        {       log(FREE, (int) 0, (long) 1);
                     84:                free(m);
                     85:        }
                     86:        else
                     87:        {       log(FREE, (int) u, (long) 1);
                     88:                m->link = freelist[u];
                     89:                freelist[u] = m;
                     90:        }
                     91: }
                     92: 
                     93: #if DEBUG
                     94: double
                     95: a_stats()
                     96: { register int i;
                     97:   long p, a, f, j;
                     98:   long sum = 0;
                     99: 
                    100:        fprintf(stderr, "chunk\t  pool\tallocs\t frees\t spill\n");
                    101:        for (i = 0; i < A_LARGE; i++)
                    102:        {
                    103:                p = event[POOL][i];
                    104:                a = event[ALLOC][i];
                    105:                f = event[FREE][i];
                    106: 
                    107:                if( !(p|a|f) )
                    108:                        continue;
                    109: 
                    110:                j = (long) (i * sizeof(union M));
                    111:                fprintf(stderr, "%5d\t%6ld\t%6ld\t%6ld\t%6ld\n", j, p, a, f, a-f);
                    112: 
                    113:                sum += p*j;
                    114:        }
                    115:        fprintf(stderr, "total pools  %7u\n", sum);
                    116: 
                    117:        return (double) sum;
                    118: }
                    119: #endif

unix.superglobalmegacorp.com

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