xref: /plan9/sys/src/libthread/lib.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 static long totalmalloc;
7*9a747e4fSDavid du Colombier 
8*9a747e4fSDavid du Colombier void*
9*9a747e4fSDavid du Colombier _threadmalloc(long size, int z)
10*9a747e4fSDavid du Colombier {
11*9a747e4fSDavid du Colombier 	void *m;
12*9a747e4fSDavid du Colombier 
13*9a747e4fSDavid du Colombier 	m = malloc(size);
14*9a747e4fSDavid du Colombier 	if (m == nil)
15*9a747e4fSDavid du Colombier 		sysfatal("Malloc of size %ld failed: %r\n", size);
16*9a747e4fSDavid du Colombier 	setmalloctag(m, getcallerpc(&size));
17*9a747e4fSDavid du Colombier 	totalmalloc += size;
18*9a747e4fSDavid du Colombier 	if (size > 1000000) {
19*9a747e4fSDavid du Colombier 		fprint(2, "Malloc of size %ld, total %ld\n", size, totalmalloc);
20*9a747e4fSDavid du Colombier 		abort();
21*9a747e4fSDavid du Colombier 	}
22*9a747e4fSDavid du Colombier 	if (z)
23*9a747e4fSDavid du Colombier 		memset(m, 0, size);
24*9a747e4fSDavid du Colombier 	return m;
25*9a747e4fSDavid du Colombier }
26*9a747e4fSDavid du Colombier 
27*9a747e4fSDavid du Colombier void
28*9a747e4fSDavid du Colombier _threadsysfatal(char *fmt, va_list arg)
29*9a747e4fSDavid du Colombier {
30*9a747e4fSDavid du Colombier 	char buf[1024];	/* size doesn't matter; we're about to exit */
31*9a747e4fSDavid du Colombier 
32*9a747e4fSDavid du Colombier 	vseprint(buf, buf+sizeof(buf), fmt, arg);
33*9a747e4fSDavid du Colombier 	if(argv0)
34*9a747e4fSDavid du Colombier 		fprint(2, "%s: %s\n", argv0, buf);
35*9a747e4fSDavid du Colombier 	else
36*9a747e4fSDavid du Colombier 		fprint(2, "%s\n", buf);
37*9a747e4fSDavid du Colombier 	threadexitsall(buf);
38*9a747e4fSDavid du Colombier }
39