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>
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;})
13 74f990ad 2003-11-23 devnull BinSize = 8*1024
16 74f990ad 2003-11-23 devnull struct Bin
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];
27 74f990ad 2003-11-23 devnull * allocator which allows an entire set to be freed at one time
29 74f990ad 2003-11-23 devnull static Bin*
30 74f990ad 2003-11-23 devnull mkbin(Bin *bin, ulong size)
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;
48 74f990ad 2003-11-23 devnull binalloc(Bin **bin, ulong size, int zero)
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;
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;
71 74f990ad 2003-11-23 devnull b->pos = p + size;
72 74f990ad 2003-11-23 devnull b->v = p;
74 74f990ad 2003-11-23 devnull memset((void*)p, 0, size);
75 74f990ad 2003-11-23 devnull return (void*)p;
79 74f990ad 2003-11-23 devnull bingrow(Bin **bin, void *op, ulong osize, ulong size, int zero)
82 74f990ad 2003-11-23 devnull void *np;
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;
90 74f990ad 2003-11-23 devnull memset((char*)p + osize, 0, size - osize);
91 74f990ad 2003-11-23 devnull return op;
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;
101 74f990ad 2003-11-23 devnull binfree(Bin **bin)
103 74f990ad 2003-11-23 devnull Bin *last;
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);