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>
5 0faf0f0b 2005-02-13 devnull #define log not_the_log_library_call
8 0faf0f0b 2005-02-13 devnull { /* defaults */
9 0faf0f0b 2005-02-13 devnull LogChunkSize = 8192,
10 0faf0f0b 2005-02-13 devnull LogSize = 65536,
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];
18 0faf0f0b 2005-02-13 devnull static uint
19 0faf0f0b 2005-02-13 devnull hash(char *s)
22 0faf0f0b 2005-02-13 devnull uchar *p;
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;
31 0faf0f0b 2005-02-13 devnull vtlogopen(char *name, uint size)
34 0faf0f0b 2005-02-13 devnull int i, nc;
36 0faf0f0b 2005-02-13 devnull VtLog *l, *last;
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;
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;
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;
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;
71 0faf0f0b 2005-02-13 devnull strcpy(p, name);
72 0faf0f0b 2005-02-13 devnull l->name = p;
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;
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;
84 0faf0f0b 2005-02-13 devnull vtlogclose(VtLog *l)
86 0faf0f0b 2005-02-13 devnull if(l == nil)
89 0faf0f0b 2005-02-13 devnull qlock(&vl.lk);
90 0faf0f0b 2005-02-13 devnull if(--l->ref == 0)
93 0faf0f0b 2005-02-13 devnull assert(l->ref > 0);
94 0faf0f0b 2005-02-13 devnull qunlock(&vl.lk);
98 0faf0f0b 2005-02-13 devnull vtlogremove(char *name)
101 0faf0f0b 2005-02-13 devnull VtLog *last, *l;
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;
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);
116 0faf0f0b 2005-02-13 devnull qunlock(&vl.lk);
120 0faf0f0b 2005-02-13 devnull vtlogvprint(VtLog *l, char *fmt, va_list arg)
123 0faf0f0b 2005-02-13 devnull char *p;
124 0faf0f0b 2005-02-13 devnull VtLogChunk *c;
126 0faf0f0b 2005-02-13 devnull if(l == nil)
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){
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;
139 0faf0f0b 2005-02-13 devnull p = vseprint(c->wp, c->ep, fmt, arg);
141 0faf0f0b 2005-02-13 devnull c->wp = p;
142 0faf0f0b 2005-02-13 devnull qunlock(&l->lk);
146 0faf0f0b 2005-02-13 devnull vtlogprint(VtLog *l, char *fmt, ...)
148 0faf0f0b 2005-02-13 devnull va_list arg;
150 0faf0f0b 2005-02-13 devnull if(l == nil)
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);
159 0faf0f0b 2005-02-13 devnull vtlog(char *name, char *fmt, ...)
161 0faf0f0b 2005-02-13 devnull VtLog *l;
162 0faf0f0b 2005-02-13 devnull va_list arg;
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);
172 0faf0f0b 2005-02-13 devnull vtlogdump(int fd, VtLog *l)
175 0faf0f0b 2005-02-13 devnull VtLogChunk *c;
177 0faf0f0b 2005-02-13 devnull if(l == nil)
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);
186 0faf0f0b 2005-02-13 devnull vtlogclose(l);