Blame


1 74f990ad 2003-11-23 devnull #include <u.h>
2 74f990ad 2003-11-23 devnull #include <libc.h>
3 74f990ad 2003-11-23 devnull #include <bin.h>
4 74f990ad 2003-11-23 devnull
5 74f990ad 2003-11-23 devnull enum
6 74f990ad 2003-11-23 devnull {
7 74f990ad 2003-11-23 devnull StructAlign = sizeof(union {vlong vl; double d; ulong p; void *v;
8 74f990ad 2003-11-23 devnull struct{vlong v;}vs; struct{double d;}ds; struct{ulong p;}ss; struct{void *v;}xs;})
9 74f990ad 2003-11-23 devnull };
10 74f990ad 2003-11-23 devnull
11 74f990ad 2003-11-23 devnull enum
12 74f990ad 2003-11-23 devnull {
13 74f990ad 2003-11-23 devnull BinSize = 8*1024
14 74f990ad 2003-11-23 devnull };
15 74f990ad 2003-11-23 devnull
16 74f990ad 2003-11-23 devnull struct Bin
17 74f990ad 2003-11-23 devnull {
18 74f990ad 2003-11-23 devnull Bin *next;
19 74f990ad 2003-11-23 devnull ulong total; /* total bytes allocated in can->next */
20 74f990ad 2003-11-23 devnull ulong pos;
21 74f990ad 2003-11-23 devnull ulong end;
22 74f990ad 2003-11-23 devnull ulong v; /* last value allocated */
23 74f990ad 2003-11-23 devnull uchar body[BinSize];
24 74f990ad 2003-11-23 devnull };
25 74f990ad 2003-11-23 devnull
26 74f990ad 2003-11-23 devnull /*
27 74f990ad 2003-11-23 devnull * allocator which allows an entire set to be freed at one time
28 74f990ad 2003-11-23 devnull */
29 74f990ad 2003-11-23 devnull static Bin*
30 74f990ad 2003-11-23 devnull mkbin(Bin *bin, ulong size)
31 74f990ad 2003-11-23 devnull {
32 74f990ad 2003-11-23 devnull Bin *b;
33 74f990ad 2003-11-23 devnull
34 74f990ad 2003-11-23 devnull size = ((size << 1) + (BinSize - 1)) & ~(BinSize - 1);
35 74f990ad 2003-11-23 devnull b = malloc(sizeof(Bin) + size - BinSize);
36 74f990ad 2003-11-23 devnull if(b == nil)
37 74f990ad 2003-11-23 devnull return nil;
38 74f990ad 2003-11-23 devnull b->next = bin;
39 74f990ad 2003-11-23 devnull b->total = 0;
40 74f990ad 2003-11-23 devnull if(bin != nil)
41 74f990ad 2003-11-23 devnull b->total = bin->total + bin->pos - (ulong)bin->body;
42 74f990ad 2003-11-23 devnull b->pos = (ulong)b->body;
43 74f990ad 2003-11-23 devnull b->end = b->pos + size;
44 74f990ad 2003-11-23 devnull return b;
45 74f990ad 2003-11-23 devnull }
46 74f990ad 2003-11-23 devnull
47 74f990ad 2003-11-23 devnull void*
48 74f990ad 2003-11-23 devnull binalloc(Bin **bin, ulong size, int zero)
49 74f990ad 2003-11-23 devnull {
50 74f990ad 2003-11-23 devnull Bin *b;
51 74f990ad 2003-11-23 devnull ulong p;
52 74f990ad 2003-11-23 devnull
53 74f990ad 2003-11-23 devnull if(size == 0)
54 74f990ad 2003-11-23 devnull size = 1;
55 74f990ad 2003-11-23 devnull b = *bin;
56 74f990ad 2003-11-23 devnull if(b == nil){
57 74f990ad 2003-11-23 devnull b = mkbin(nil, size);
58 74f990ad 2003-11-23 devnull if(b == nil)
59 74f990ad 2003-11-23 devnull return nil;
60 74f990ad 2003-11-23 devnull *bin = b;
61 74f990ad 2003-11-23 devnull }
62 74f990ad 2003-11-23 devnull p = b->pos;
63 74f990ad 2003-11-23 devnull p = (p + (StructAlign - 1)) & ~(StructAlign - 1);
64 74f990ad 2003-11-23 devnull if(p + size > b->end){
65 74f990ad 2003-11-23 devnull b = mkbin(b, size);
66 74f990ad 2003-11-23 devnull if(b == nil)
67 74f990ad 2003-11-23 devnull return nil;
68 74f990ad 2003-11-23 devnull *bin = b;
69 74f990ad 2003-11-23 devnull p = b->pos;
70 74f990ad 2003-11-23 devnull }
71 74f990ad 2003-11-23 devnull b->pos = p + size;
72 74f990ad 2003-11-23 devnull b->v = p;
73 74f990ad 2003-11-23 devnull if(zero)
74 74f990ad 2003-11-23 devnull memset((void*)p, 0, size);
75 74f990ad 2003-11-23 devnull return (void*)p;
76 74f990ad 2003-11-23 devnull }
77 74f990ad 2003-11-23 devnull
78 74f990ad 2003-11-23 devnull void*
79 74f990ad 2003-11-23 devnull bingrow(Bin **bin, void *op, ulong osize, ulong size, int zero)
80 74f990ad 2003-11-23 devnull {
81 74f990ad 2003-11-23 devnull Bin *b;
82 74f990ad 2003-11-23 devnull void *np;
83 74f990ad 2003-11-23 devnull ulong p;
84 74f990ad 2003-11-23 devnull
85 74f990ad 2003-11-23 devnull p = (ulong)op;
86 74f990ad 2003-11-23 devnull b = *bin;
87 74f990ad 2003-11-23 devnull if(b != nil && p == b->v && p + size <= b->end){
88 74f990ad 2003-11-23 devnull b->pos = p + size;
89 74f990ad 2003-11-23 devnull if(zero)
90 74f990ad 2003-11-23 devnull memset((char*)p + osize, 0, size - osize);
91 74f990ad 2003-11-23 devnull return op;
92 74f990ad 2003-11-23 devnull }
93 74f990ad 2003-11-23 devnull np = binalloc(bin, size, zero);
94 74f990ad 2003-11-23 devnull if(np == nil)
95 74f990ad 2003-11-23 devnull return nil;
96 74f990ad 2003-11-23 devnull memmove(np, op, osize);
97 74f990ad 2003-11-23 devnull return np;
98 74f990ad 2003-11-23 devnull }
99 74f990ad 2003-11-23 devnull
100 74f990ad 2003-11-23 devnull void
101 74f990ad 2003-11-23 devnull binfree(Bin **bin)
102 74f990ad 2003-11-23 devnull {
103 74f990ad 2003-11-23 devnull Bin *last;
104 74f990ad 2003-11-23 devnull
105 74f990ad 2003-11-23 devnull while(*bin != nil){
106 74f990ad 2003-11-23 devnull last = *bin;
107 74f990ad 2003-11-23 devnull *bin = (*bin)->next;
108 74f990ad 2003-11-23 devnull last->pos = (ulong)last->body;
109 74f990ad 2003-11-23 devnull free(last);
110 74f990ad 2003-11-23 devnull }
111 74f990ad 2003-11-23 devnull }