|
|
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
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.