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