tprimes.c (1192B)
1 #include "u.h" 2 #include "libc.h" 3 #include "thread.h" 4 5 enum 6 { 7 STACK = 8192 8 }; 9 10 int max = 10000; 11 int (*mk)(void (*fn)(void*), void *arg, uint stack); 12 void printmsg(void*, char*); 13 14 void 15 countthread(void *v) 16 { 17 uint i; 18 Channel *c; 19 20 c = v; 21 for(i=2;; i++){ 22 sendul(c, i); 23 } 24 } 25 26 void 27 filterthread(void *v) 28 { 29 uint i, p; 30 Channel *c, *nextc; 31 32 c = v; 33 p = recvul(c); 34 print("%d\n", p); 35 if(p > max) 36 threadexitsall(0); 37 nextc = chancreate(sizeof(ulong), 0); 38 mk(filterthread, nextc, STACK); 39 for(;;){ 40 i = recvul(c); 41 if(i%p) 42 sendul(nextc, i); 43 } 44 } 45 46 void 47 usage(void) 48 { 49 fprint(2, "usage: tprimes [-p] [max]\n"); 50 threadexitsall("usage"); 51 } 52 53 void 54 threadmain(int argc, char **argv) 55 { 56 Channel *c; 57 int nbuf; 58 59 notify(printmsg); 60 nbuf = 0; 61 mk = threadcreate; 62 ARGBEGIN{ 63 default: 64 usage(); 65 case 'b': 66 nbuf = atoi(EARGF(usage())); 67 break; 68 case 'p': 69 mk = proccreate; 70 max = 1000; 71 break; 72 }ARGEND 73 74 if(argc == 1) 75 max = atoi(argv[0]); 76 else if(argc) 77 usage(); 78 79 c = chancreate(sizeof(ulong), nbuf); 80 mk(countthread, c, STACK); 81 mk(filterthread, c, STACK); 82 recvp(chancreate(sizeof(void*), 0)); 83 threadexitsall(0); 84 } 85 86 void 87 printmsg(void *v, char *msg) 88 { 89 print("note: %s\n", msg); 90 }