| #include "u.h" |
| #include "libc.h" |
| #include "thread.h" |
| |
| enum |
| { |
| STACK = 8192 |
| }; |
| |
| int max = 10000; |
| int (*mk)(void (*fn)(void*), void *arg, uint stack); |
| void printmsg(void*, char*); |
| |
| void |
| countthread(void *v) |
| { |
| uint i; |
| Channel *c; |
| |
| c = v; |
| for(i=2;; i++){ |
| sendul(c, i); |
| } |
| } |
| |
| void |
| filterthread(void *v) |
| { |
| uint i, p; |
| Channel *c, *nextc; |
| |
| c = v; |
| p = recvul(c); |
| print("%d\n", p); |
| if(p > max) |
| threadexitsall(0); |
| nextc = chancreate(sizeof(ulong), 0); |
| mk(filterthread, nextc, STACK); |
| for(;;){ |
| i = recvul(c); |
| if(i%p) |
| sendul(nextc, i); |
| } |
| } |
| |
| void |
| usage(void) |
| { |
| fprint(2, "usage: tprimes [-p] [max]\n"); |
| threadexitsall("usage"); |
| } |
| |
| void |
| threadmain(int argc, char **argv) |
| { |
| Channel *c; |
| int nbuf; |
| |
| notify(printmsg); |
| nbuf = 0; |
| mk = threadcreate; |
| ARGBEGIN{ |
| default: |
| usage(); |
| case 'b': |
| nbuf = atoi(EARGF(usage())); |
| break; |
| case 'p': |
| mk = proccreate; |
| max = 1000; |
| break; |
| }ARGEND |
| |
| if(argc == 1) |
| max = atoi(argv[0]); |
| else if(argc) |
| usage(); |
| |
| c = chancreate(sizeof(ulong), nbuf); |
| mk(countthread, c, STACK); |
| mk(filterthread, c, STACK); |
| recvp(chancreate(sizeof(void*), 0)); |
| threadexitsall(0); |
| } |
| |
| void |
| printmsg(void *v, char *msg) |
| { |
| print("note: %s\n", msg); |
| } |