Blame


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