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