Blame


1 0faf0f0b 2005-02-13 devnull #include <u.h>
2 0faf0f0b 2005-02-13 devnull #include <libc.h>
3 0faf0f0b 2005-02-13 devnull #include <venti.h>
4 0faf0f0b 2005-02-13 devnull
5 0faf0f0b 2005-02-13 devnull #define log not_the_log_library_call
6 0faf0f0b 2005-02-13 devnull
7 0faf0f0b 2005-02-13 devnull enum
8 0faf0f0b 2005-02-13 devnull { /* defaults */
9 0faf0f0b 2005-02-13 devnull LogChunkSize = 8192,
10 0faf0f0b 2005-02-13 devnull LogSize = 65536,
11 0faf0f0b 2005-02-13 devnull };
12 0faf0f0b 2005-02-13 devnull
13 0faf0f0b 2005-02-13 devnull static struct {
14 0faf0f0b 2005-02-13 devnull QLock lk;
15 0faf0f0b 2005-02-13 devnull VtLog *hash[1024];
16 0faf0f0b 2005-02-13 devnull } vl;
17 0faf0f0b 2005-02-13 devnull
18 0faf0f0b 2005-02-13 devnull static uint
19 0faf0f0b 2005-02-13 devnull hash(char *s)
20 0faf0f0b 2005-02-13 devnull {
21 0faf0f0b 2005-02-13 devnull uint h;
22 0faf0f0b 2005-02-13 devnull uchar *p;
23 0faf0f0b 2005-02-13 devnull
24 0faf0f0b 2005-02-13 devnull h = 0;
25 0faf0f0b 2005-02-13 devnull for(p=(uchar*)s; *p; p++)
26 0faf0f0b 2005-02-13 devnull h = h*37 + *p;
27 0faf0f0b 2005-02-13 devnull return h;
28 0faf0f0b 2005-02-13 devnull }
29 0faf0f0b 2005-02-13 devnull
30 0faf0f0b 2005-02-13 devnull VtLog*
31 0faf0f0b 2005-02-13 devnull vtlogopen(char *name, uint size)
32 0faf0f0b 2005-02-13 devnull {
33 0faf0f0b 2005-02-13 devnull uint h;
34 0faf0f0b 2005-02-13 devnull int i, nc;
35 0faf0f0b 2005-02-13 devnull char *p;
36 0faf0f0b 2005-02-13 devnull VtLog *l, *last;
37 0faf0f0b 2005-02-13 devnull
38 0faf0f0b 2005-02-13 devnull h = hash(name)%nelem(vl.hash);
39 0faf0f0b 2005-02-13 devnull qlock(&vl.lk);
40 0faf0f0b 2005-02-13 devnull last = nil;
41 0faf0f0b 2005-02-13 devnull for(l=vl.hash[h]; l; last=l, l=l->next)
42 0faf0f0b 2005-02-13 devnull if(strcmp(l->name, name) == 0){
43 0faf0f0b 2005-02-13 devnull if(last){ /* move to front */
44 0faf0f0b 2005-02-13 devnull last->next = l->next;
45 0faf0f0b 2005-02-13 devnull l->next = vl.hash[h];
46 0faf0f0b 2005-02-13 devnull vl.hash[h] = l;
47 0faf0f0b 2005-02-13 devnull }
48 0faf0f0b 2005-02-13 devnull l->ref++;
49 0faf0f0b 2005-02-13 devnull qunlock(&vl.lk);
50 0faf0f0b 2005-02-13 devnull return l;
51 0faf0f0b 2005-02-13 devnull }
52 0faf0f0b 2005-02-13 devnull
53 0faf0f0b 2005-02-13 devnull if(size == 0){
54 0faf0f0b 2005-02-13 devnull qunlock(&vl.lk);
55 0faf0f0b 2005-02-13 devnull return nil;
56 0faf0f0b 2005-02-13 devnull }
57 0faf0f0b 2005-02-13 devnull
58 0faf0f0b 2005-02-13 devnull /* allocate */
59 0faf0f0b 2005-02-13 devnull nc = (size+LogChunkSize-1)/LogChunkSize;
60 0faf0f0b 2005-02-13 devnull l = vtmalloc(sizeof *l + nc*(sizeof(*l->chunk)+LogChunkSize) + strlen(name)+1);
61 0faf0f0b 2005-02-13 devnull memset(l, 0, sizeof *l);
62 0faf0f0b 2005-02-13 devnull l->chunk = (VtLogChunk*)(l+1);
63 0faf0f0b 2005-02-13 devnull l->nchunk = nc;
64 0faf0f0b 2005-02-13 devnull l->w = l->chunk;
65 0faf0f0b 2005-02-13 devnull p = (char*)(l->chunk+nc);
66 0faf0f0b 2005-02-13 devnull for(i=0; i<nc; i++){
67 0faf0f0b 2005-02-13 devnull l->chunk[i].p = p;
68 0faf0f0b 2005-02-13 devnull p += LogChunkSize;
69 0faf0f0b 2005-02-13 devnull l->chunk[i].ep = p;
70 0faf0f0b 2005-02-13 devnull }
71 0faf0f0b 2005-02-13 devnull strcpy(p, name);
72 0faf0f0b 2005-02-13 devnull l->name = p;
73 0faf0f0b 2005-02-13 devnull
74 0faf0f0b 2005-02-13 devnull /* insert */
75 0faf0f0b 2005-02-13 devnull l->next = vl.hash[h];
76 0faf0f0b 2005-02-13 devnull vl.hash[h] = l;
77 0faf0f0b 2005-02-13 devnull
78 0faf0f0b 2005-02-13 devnull l->ref++;
79 0faf0f0b 2005-02-13 devnull qunlock(&vl.lk);
80 0faf0f0b 2005-02-13 devnull return l;
81 0faf0f0b 2005-02-13 devnull }
82 0faf0f0b 2005-02-13 devnull
83 0faf0f0b 2005-02-13 devnull void
84 0faf0f0b 2005-02-13 devnull vtlogclose(VtLog *l)
85 0faf0f0b 2005-02-13 devnull {
86 0faf0f0b 2005-02-13 devnull if(l == nil)
87 0faf0f0b 2005-02-13 devnull return;
88 0faf0f0b 2005-02-13 devnull
89 0faf0f0b 2005-02-13 devnull qlock(&vl.lk);
90 0faf0f0b 2005-02-13 devnull if(--l->ref == 0)
91 0faf0f0b 2005-02-13 devnull free(l);
92 0faf0f0b 2005-02-13 devnull else
93 0faf0f0b 2005-02-13 devnull assert(l->ref > 0);
94 0faf0f0b 2005-02-13 devnull qunlock(&vl.lk);
95 0faf0f0b 2005-02-13 devnull }
96 0faf0f0b 2005-02-13 devnull
97 0faf0f0b 2005-02-13 devnull void
98 0faf0f0b 2005-02-13 devnull vtlogremove(char *name)
99 0faf0f0b 2005-02-13 devnull {
100 0faf0f0b 2005-02-13 devnull uint h;
101 0faf0f0b 2005-02-13 devnull VtLog *last, *l;
102 0faf0f0b 2005-02-13 devnull
103 0faf0f0b 2005-02-13 devnull h = hash(name)%nelem(vl.hash);
104 0faf0f0b 2005-02-13 devnull qlock(&vl.lk);
105 0faf0f0b 2005-02-13 devnull last = nil;
106 0faf0f0b 2005-02-13 devnull for(l=vl.hash[h]; l; last=l, l=l->next)
107 0faf0f0b 2005-02-13 devnull if(strcmp(l->name, name) == 0){
108 0faf0f0b 2005-02-13 devnull if(last)
109 0faf0f0b 2005-02-13 devnull last->next = l->next;
110 0faf0f0b 2005-02-13 devnull else
111 0faf0f0b 2005-02-13 devnull vl.hash[h] = l->next;
112 0faf0f0b 2005-02-13 devnull qunlock(&vl.lk);
113 0faf0f0b 2005-02-13 devnull vtlogclose(l);
114 0faf0f0b 2005-02-13 devnull return;
115 0faf0f0b 2005-02-13 devnull }
116 0faf0f0b 2005-02-13 devnull qunlock(&vl.lk);
117 0faf0f0b 2005-02-13 devnull }
118 0faf0f0b 2005-02-13 devnull
119 0faf0f0b 2005-02-13 devnull void
120 0faf0f0b 2005-02-13 devnull vtlogvprint(VtLog *l, char *fmt, va_list arg)
121 0faf0f0b 2005-02-13 devnull {
122 0faf0f0b 2005-02-13 devnull int n;
123 0faf0f0b 2005-02-13 devnull char *p;
124 0faf0f0b 2005-02-13 devnull VtLogChunk *c;
125 0faf0f0b 2005-02-13 devnull
126 0faf0f0b 2005-02-13 devnull if(l == nil)
127 0faf0f0b 2005-02-13 devnull return;
128 0faf0f0b 2005-02-13 devnull
129 0faf0f0b 2005-02-13 devnull qlock(&l->lk);
130 0faf0f0b 2005-02-13 devnull c = l->w;
131 0faf0f0b 2005-02-13 devnull n = c->ep - c->wp;
132 0faf0f0b 2005-02-13 devnull if(n < 512){
133 0faf0f0b 2005-02-13 devnull c++;
134 0faf0f0b 2005-02-13 devnull if(c == l->chunk+l->nchunk)
135 0faf0f0b 2005-02-13 devnull c = l->chunk;
136 0faf0f0b 2005-02-13 devnull c->wp = c->p;
137 0faf0f0b 2005-02-13 devnull l->w = c;
138 0faf0f0b 2005-02-13 devnull }
139 0faf0f0b 2005-02-13 devnull p = vseprint(c->wp, c->ep, fmt, arg);
140 0faf0f0b 2005-02-13 devnull if(p)
141 0faf0f0b 2005-02-13 devnull c->wp = p;
142 0faf0f0b 2005-02-13 devnull qunlock(&l->lk);
143 0faf0f0b 2005-02-13 devnull }
144 0faf0f0b 2005-02-13 devnull
145 0faf0f0b 2005-02-13 devnull void
146 0faf0f0b 2005-02-13 devnull vtlogprint(VtLog *l, char *fmt, ...)
147 0faf0f0b 2005-02-13 devnull {
148 0faf0f0b 2005-02-13 devnull va_list arg;
149 0faf0f0b 2005-02-13 devnull
150 0faf0f0b 2005-02-13 devnull if(l == nil)
151 0faf0f0b 2005-02-13 devnull return;
152 0faf0f0b 2005-02-13 devnull
153 0faf0f0b 2005-02-13 devnull va_start(arg, fmt);
154 0faf0f0b 2005-02-13 devnull vtlogvprint(l, fmt, arg);
155 0faf0f0b 2005-02-13 devnull va_end(arg);
156 0faf0f0b 2005-02-13 devnull }
157 0faf0f0b 2005-02-13 devnull
158 0faf0f0b 2005-02-13 devnull void
159 0faf0f0b 2005-02-13 devnull vtlog(char *name, char *fmt, ...)
160 0faf0f0b 2005-02-13 devnull {
161 0faf0f0b 2005-02-13 devnull VtLog *l;
162 0faf0f0b 2005-02-13 devnull va_list arg;
163 0faf0f0b 2005-02-13 devnull
164 0faf0f0b 2005-02-13 devnull l = vtlogopen(name, LogSize);
165 0faf0f0b 2005-02-13 devnull va_start(arg, fmt);
166 0faf0f0b 2005-02-13 devnull vtlogvprint(l, fmt, arg);
167 0faf0f0b 2005-02-13 devnull va_end(arg);
168 0faf0f0b 2005-02-13 devnull vtlogclose(l);
169 0faf0f0b 2005-02-13 devnull }
170 0faf0f0b 2005-02-13 devnull
171 0faf0f0b 2005-02-13 devnull void
172 0faf0f0b 2005-02-13 devnull vtlogdump(int fd, VtLog *l)
173 0faf0f0b 2005-02-13 devnull {
174 0faf0f0b 2005-02-13 devnull int i;
175 0faf0f0b 2005-02-13 devnull VtLogChunk *c;
176 0faf0f0b 2005-02-13 devnull
177 0faf0f0b 2005-02-13 devnull if(l == nil)
178 0faf0f0b 2005-02-13 devnull return;
179 0faf0f0b 2005-02-13 devnull
180 0faf0f0b 2005-02-13 devnull c = l->w;
181 0faf0f0b 2005-02-13 devnull for(i=0; i<l->nchunk; i++){
182 0faf0f0b 2005-02-13 devnull if(++c == l->chunk+l->nchunk)
183 0faf0f0b 2005-02-13 devnull c = l->chunk;
184 0faf0f0b 2005-02-13 devnull write(fd, c->p, c->wp-c->p);
185 0faf0f0b 2005-02-13 devnull }
186 0faf0f0b 2005-02-13 devnull vtlogclose(l);
187 0faf0f0b 2005-02-13 devnull }
188 0faf0f0b 2005-02-13 devnull