|
|
1.1 root 1: #include <stdio.h>
2: #include "trace.h"
3:
4: #define A_LARGE 64
5: #define A_USER 0x55000000
6:
7: #define POOL 0
8: #define ALLOC 1
9: #define FREE 2
10: #define NREVENT 3
11:
12: union M {
13: long size;
14: union M *link;
15: };
16:
17: union M *freelist[A_LARGE];
18: long req[A_LARGE];
19:
20: char *
21: talloc(u)
22: long u;
23: { union M *m;
24: register r;
25: char *Smalloc();
26:
27: u = ((u-1)/sizeof(union M) + 2);
28:
29: if( u >= A_LARGE )
30: { m = (union M *) malloc( u * sizeof(union M) );
31: if (m == NULL)
32: whoops("malloc fault");
33: } else
34: { if( freelist[u] == NULL )
35: { r = req[u] += req[u] ? req[u] : 1;
36: if (r > NOTOOBIG)
37: r = req[u] = NOTOOBIG+1;
38: freelist[u] = (union M *) Smalloc( r*u*sizeof(union M) );
39: if (freelist[u] == NULL)
40: whoops("malloc fault");
41:
42: (freelist[u] + u*(r-1))->link = 0;
43: for (m = freelist[u] + u*(r-2); m >= freelist[u]; m -= u)
44: m->link = m+u;
45: }
46:
47: m = freelist[u];
48: freelist[u] = m->link;
49: }
50: m->size = u | A_USER;
51:
52: return (char *) (m+1);
53: }
54:
55: tfree(v)
56: char *v;
57: { register union M *m = (union M *) v;
58: register long u;
59:
60: --m;
61: if ( (m->size&0xFF000000) != A_USER)
62: { fprintf(stderr, "releasing a free block\n");
63: kill(getpid(), 3);
64: }
65:
66: u = (m->size &= 0xFFFFFF);
67: if ( u >= A_LARGE )
68: free(m);
69: else
70: { m->link = freelist[u];
71: freelist[u] = m;
72: }
73: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.