Blob


1 #include <u.h>
2 #include <libc.h>
3 #include <thread.h>
5 enum
6 {
7 STACK = 8192
8 };
10 int quiet;
11 int goal;
12 int buffer;
13 int (*fn)(void(*)(void*), void*, uint) = threadcreate;
15 void
16 primethread(void *arg)
17 {
18 Channel *c, *nc;
19 int p, i;
21 c = arg;
22 p = recvul(c);
23 if(p > goal)
24 threadexitsall(nil);
25 if(!quiet)
26 print("%d\n", p);
27 nc = chancreate(sizeof(ulong), buffer);
28 (*fn)(primethread, nc, STACK);
29 for(;;){
30 i = recvul(c);
31 if(i%p)
32 sendul(nc, i);
33 }
34 }
36 extern int _threaddebuglevel;
38 void
39 threadmain(int argc, char **argv)
40 {
41 int i;
42 Channel *c;
44 ARGBEGIN{
45 case 'D':
46 _threaddebuglevel = atoi(ARGF());
47 break;
48 case 'q':
49 quiet = 1;
50 break;
51 case 'b':
52 buffer = atoi(ARGF());
53 break;
54 case 'p':
55 fn = proccreate;
56 break;
57 }ARGEND
59 if(argc>0)
60 goal = atoi(argv[0]);
61 else
62 goal = 100;
64 c = chancreate(sizeof(ulong), buffer);
65 (*fn)(primethread, c, STACK);
66 for(i=2;; i++)
67 sendul(c, i);
68 }