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 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 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