xref: /plan9/sys/src/libthread/debug.c (revision 9a747e4fd48b9f4522c70c07e8f882a15030f964)
1*9a747e4fSDavid du Colombier #include <u.h>
2*9a747e4fSDavid du Colombier #include <libc.h>
3*9a747e4fSDavid du Colombier #include <thread.h>
4*9a747e4fSDavid du Colombier #include "threadimpl.h"
5*9a747e4fSDavid du Colombier 
6*9a747e4fSDavid du Colombier int _threaddebuglevel;
7*9a747e4fSDavid du Colombier 
8*9a747e4fSDavid du Colombier void
_threaddebug(ulong flag,char * fmt,...)9*9a747e4fSDavid du Colombier _threaddebug(ulong flag, char *fmt, ...)
10*9a747e4fSDavid du Colombier {
11*9a747e4fSDavid du Colombier 	char buf[128];
12*9a747e4fSDavid du Colombier 	va_list arg;
13*9a747e4fSDavid du Colombier 	Fmt f;
14*9a747e4fSDavid du Colombier 	Proc *p;
15*9a747e4fSDavid du Colombier 
16*9a747e4fSDavid du Colombier 	if((_threaddebuglevel&flag) == 0)
17*9a747e4fSDavid du Colombier 		return;
18*9a747e4fSDavid du Colombier 
19*9a747e4fSDavid du Colombier 	fmtfdinit(&f, 2, buf, sizeof buf);
20*9a747e4fSDavid du Colombier 
21*9a747e4fSDavid du Colombier 	p = _threadgetproc();
22*9a747e4fSDavid du Colombier 	if(p==nil)
23*9a747e4fSDavid du Colombier 		fmtprint(&f, "noproc ");
24*9a747e4fSDavid du Colombier 	else if(p->thread)
25*9a747e4fSDavid du Colombier 		fmtprint(&f, "%d.%d ", p->pid, p->thread->id);
26*9a747e4fSDavid du Colombier 	else
27*9a747e4fSDavid du Colombier 		fmtprint(&f, "%d._ ", p->pid);
28*9a747e4fSDavid du Colombier 
29*9a747e4fSDavid du Colombier 	va_start(arg, fmt);
30*9a747e4fSDavid du Colombier 	fmtvprint(&f, fmt, arg);
31*9a747e4fSDavid du Colombier 	va_end(arg);
32*9a747e4fSDavid du Colombier 	fmtprint(&f, "\n");
33*9a747e4fSDavid du Colombier 	fmtfdflush(&f);
34*9a747e4fSDavid du Colombier }
35*9a747e4fSDavid du Colombier 
36*9a747e4fSDavid du Colombier void
_threadassert(char * s)37*9a747e4fSDavid du Colombier _threadassert(char *s)
38*9a747e4fSDavid du Colombier {
39*9a747e4fSDavid du Colombier 	char buf[256];
40*9a747e4fSDavid du Colombier 	int n;
41*9a747e4fSDavid du Colombier 	Proc *p;
42*9a747e4fSDavid du Colombier 
43*9a747e4fSDavid du Colombier 	p = _threadgetproc();
44*9a747e4fSDavid du Colombier 	if(p && p->thread)
45*9a747e4fSDavid du Colombier 		n = sprint(buf, "%d.%d ", p->pid, p->thread->id);
46*9a747e4fSDavid du Colombier 	else
47*9a747e4fSDavid du Colombier 		n = 0;
48*9a747e4fSDavid du Colombier 	snprint(buf+n, sizeof(buf)-n, "%s: assertion failed\n", s);
49*9a747e4fSDavid du Colombier 	write(2, buf, strlen(buf));
50*9a747e4fSDavid du Colombier 	abort();
51*9a747e4fSDavid du Colombier }
52