2004-12-25 21:56:33 +00:00
|
|
|
#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
|
|
|
|
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;
|
|
|
|
|
|
|
|
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);
|
2004-12-27 16:52:26 +00:00
|
|
|
recvp(chancreate(sizeof(void*), 0));
|
2004-12-25 21:56:33 +00:00
|
|
|
}
|