xref: /plan9/sys/src/libthread/tprimes.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 
5*9a747e4fSDavid du Colombier int quiet;
6*9a747e4fSDavid du Colombier int goal;
7*9a747e4fSDavid du Colombier int buffer;
8*9a747e4fSDavid du Colombier int (*fn)(void(*)(void*), void*, uint) = threadcreate;
9*9a747e4fSDavid du Colombier 
10*9a747e4fSDavid du Colombier void
primethread(void * arg)11*9a747e4fSDavid du Colombier primethread(void *arg)
12*9a747e4fSDavid du Colombier {
13*9a747e4fSDavid du Colombier 	Channel *c, *nc;
14*9a747e4fSDavid du Colombier 	int p, i;
15*9a747e4fSDavid du Colombier 
16*9a747e4fSDavid du Colombier 	c = arg;
17*9a747e4fSDavid du Colombier 	p = recvul(c);
18*9a747e4fSDavid du Colombier 	if(p > goal)
19*9a747e4fSDavid du Colombier 		threadexitsall(nil);
20*9a747e4fSDavid du Colombier 	if(!quiet)
21*9a747e4fSDavid du Colombier 		print("%d\n", p);
22*9a747e4fSDavid du Colombier 	nc = chancreate(sizeof(ulong), buffer);
23*9a747e4fSDavid du Colombier 	(*fn)(primethread, nc, 1024);
24*9a747e4fSDavid du Colombier 	for(;;){
25*9a747e4fSDavid du Colombier 		i = recvul(c);
26*9a747e4fSDavid du Colombier 		if(i%p)
27*9a747e4fSDavid du Colombier 			sendul(nc, i);
28*9a747e4fSDavid du Colombier 	}
29*9a747e4fSDavid du Colombier }
30*9a747e4fSDavid du Colombier 
31*9a747e4fSDavid du Colombier void
threadmain(int argc,char ** argv)32*9a747e4fSDavid du Colombier threadmain(int argc, char **argv)
33*9a747e4fSDavid du Colombier {
34*9a747e4fSDavid du Colombier 	int i;
35*9a747e4fSDavid du Colombier 	Channel *c;
36*9a747e4fSDavid du Colombier 
37*9a747e4fSDavid du Colombier 	ARGBEGIN{
38*9a747e4fSDavid du Colombier 	case 'q':
39*9a747e4fSDavid du Colombier 		quiet = 1;
40*9a747e4fSDavid du Colombier 		break;
41*9a747e4fSDavid du Colombier 	case 'b':
42*9a747e4fSDavid du Colombier 		buffer = atoi(ARGF());
43*9a747e4fSDavid du Colombier 		break;
44*9a747e4fSDavid du Colombier 	case 'p':
45*9a747e4fSDavid du Colombier 		fn=proccreate;
46*9a747e4fSDavid du Colombier 		break;
47*9a747e4fSDavid du Colombier 	}ARGEND
48*9a747e4fSDavid du Colombier 
49*9a747e4fSDavid du Colombier 	if(argc>0)
50*9a747e4fSDavid du Colombier 		goal = atoi(argv[0]);
51*9a747e4fSDavid du Colombier 	else
52*9a747e4fSDavid du Colombier 		goal = 100;
53*9a747e4fSDavid du Colombier 
54*9a747e4fSDavid du Colombier 	c = chancreate(sizeof(ulong), buffer);
55*9a747e4fSDavid du Colombier 	threadcreate(primethread, c, 1024);
56*9a747e4fSDavid du Colombier 	for(i=2;; i++)
57*9a747e4fSDavid du Colombier 		sendul(c, i);
58*9a747e4fSDavid du Colombier }
59