|
|
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.