#include #include #include #include "dat.h" #include "fns.h" #undef trace static char magic[] = "TRACEBUF"; typedef struct Tracebuf Tracebuf; struct Tracebuf { char magic[8]; int wp; char lines[256][80]; }; static void* alloctrace(void) { Tracebuf *t; t = kmallocz(sizeof(*t), 1); memmove(t->magic, magic, sizeof(t->magic)); return t; } static void checktrace(Tracebuf *t) { if(memcmp(t->magic, magic, sizeof(t->magic)) != 0) panic("tracebuffer corrupted"); } static void freetrace(Tracebuf *t) { if(t == nil) return; checktrace(t); memset(t, 0, sizeof(*t)); free(t); } static void vputtrace(Tracebuf *t, char *fmt, va_list a) { char *s; checktrace(t); s = t->lines[t->wp++ % nelem(t->lines)]; vsnprint(s, sizeof(t->lines[0]), fmt, a); if(debug > 1) fprint(2, "%d\t%s\n", (current != nil) ? current->tid : 0, s); } void inittrace(void) { if(debug > 0) current->trace = alloctrace(); } void exittrace(Uproc *proc) { Tracebuf *t; if(t = proc->trace){ proc->trace = nil; freetrace(t); } } void clonetrace(Uproc *new, int copy) { Tracebuf *t; if((t = current->trace) == nil){ new->trace = nil; return; } if(copy){ Tracebuf *x; x = kmalloc(sizeof(*t)); memmove(x, t, sizeof(*t)); new->trace = x; return; } new->trace = alloctrace(); } void tprint(char *fmt, ...) { va_list a; Uproc *p; p = current; if(p && p->trace){ va_start(a, fmt); vputtrace((Tracebuf*)p->trace, fmt, a); va_end(a); } }