#include <u.h> | |
#include <libc.h> | |
#include <thread.h> | |
enum | |
{ | |
STACK = 8192 | |
}; | |
int quiet; | |
int goal; | |
int buffer; | |
int (*fn)(void(*)(void*), void*, uint) = threadcreate; | |
void | |
primethread(void *arg) | |
{ | |
Channel *c, *nc; | |
int p, i; | |
c = arg; | |
p = recvul(c); | |
if(p > goal) | |
threadexitsall(nil); | |
if(!quiet) | |
print("%d\n", p); | |
nc = chancreate(sizeof(ulong), buffer); | |
(*fn)(primethread, nc, STACK); | |
for(;;){ | |
i = recvul(c); | |
if(i%p) | |
sendul(nc, i); | |
} | |
} | |
extern int _threaddebuglevel; | |
void | |
threadmain(int argc, char **argv) | |
{ | |
int i; | |
Channel *c; | |
ARGBEGIN{ | |
case 'D': | |
_threaddebuglevel = atoi(ARGF()); | |
break; | |
case 'q': | |
quiet = 1; | |
break; | |
case 'b': | |
buffer = atoi(ARGF()); | |
break; | |
case 'p': | |
fn = proccreate; | |
break; | |
}ARGEND | |
if(argc>0) | |
goal = atoi(argv[0]); | |
else | |
goal = 100; | |
c = chancreate(sizeof(ulong), buffer); | |
(*fn)(primethread, c, STACK); | |
for(i=2;; i++) | |
sendul(c, i); | |
} |