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 f6127ed2 2005-01-04 devnull void printmsg(void*, char*);
13 1544f909 2004-12-25 devnull
14 1544f909 2004-12-25 devnull void
15 1544f909 2004-12-25 devnull countthread(void *v)
16 1544f909 2004-12-25 devnull {
17 1544f909 2004-12-25 devnull uint i;
18 1544f909 2004-12-25 devnull Channel *c;
19 1544f909 2004-12-25 devnull
20 1544f909 2004-12-25 devnull c = v;
21 1544f909 2004-12-25 devnull for(i=2;; i++){
22 1544f909 2004-12-25 devnull sendul(c, i);
23 1544f909 2004-12-25 devnull }
24 1544f909 2004-12-25 devnull }
25 1544f909 2004-12-25 devnull
26 1544f909 2004-12-25 devnull void
27 1544f909 2004-12-25 devnull filterthread(void *v)
28 1544f909 2004-12-25 devnull {
29 1544f909 2004-12-25 devnull uint i, p;
30 1544f909 2004-12-25 devnull Channel *c, *nextc;
31 1544f909 2004-12-25 devnull
32 1544f909 2004-12-25 devnull c = v;
33 1544f909 2004-12-25 devnull p = recvul(c);
34 1544f909 2004-12-25 devnull print("%d\n", p);
35 1544f909 2004-12-25 devnull if(p > max)
36 1544f909 2004-12-25 devnull threadexitsall(0);
37 1544f909 2004-12-25 devnull nextc = chancreate(sizeof(ulong), 0);
38 1544f909 2004-12-25 devnull mk(filterthread, nextc, STACK);
39 1544f909 2004-12-25 devnull for(;;){
40 1544f909 2004-12-25 devnull i = recvul(c);
41 1544f909 2004-12-25 devnull if(i%p)
42 1544f909 2004-12-25 devnull sendul(nextc, i);
43 1544f909 2004-12-25 devnull }
44 1544f909 2004-12-25 devnull }
45 1544f909 2004-12-25 devnull
46 1544f909 2004-12-25 devnull void
47 1544f909 2004-12-25 devnull usage(void)
48 1544f909 2004-12-25 devnull {
49 1544f909 2004-12-25 devnull fprint(2, "usage: tprimes [-p] [max]\n");
50 1544f909 2004-12-25 devnull threadexitsall("usage");
51 1544f909 2004-12-25 devnull }
52 1544f909 2004-12-25 devnull
53 1544f909 2004-12-25 devnull void
54 1544f909 2004-12-25 devnull threadmain(int argc, char **argv)
55 1544f909 2004-12-25 devnull {
56 1544f909 2004-12-25 devnull Channel *c;
57 1544f909 2004-12-25 devnull int nbuf;
58 1544f909 2004-12-25 devnull
59 f6127ed2 2005-01-04 devnull notify(printmsg);
60 1544f909 2004-12-25 devnull nbuf = 0;
61 1544f909 2004-12-25 devnull mk = threadcreate;
62 1544f909 2004-12-25 devnull ARGBEGIN{
63 1544f909 2004-12-25 devnull default:
64 1544f909 2004-12-25 devnull usage();
65 1544f909 2004-12-25 devnull case 'b':
66 1544f909 2004-12-25 devnull nbuf = atoi(EARGF(usage()));
67 1544f909 2004-12-25 devnull break;
68 1544f909 2004-12-25 devnull case 'p':
69 1544f909 2004-12-25 devnull mk = proccreate;
70 1544f909 2004-12-25 devnull max = 1000;
71 1544f909 2004-12-25 devnull break;
72 1544f909 2004-12-25 devnull }ARGEND
73 1544f909 2004-12-25 devnull
74 1544f909 2004-12-25 devnull if(argc == 1)
75 1544f909 2004-12-25 devnull max = atoi(argv[0]);
76 1544f909 2004-12-25 devnull else if(argc)
77 1544f909 2004-12-25 devnull usage();
78 1544f909 2004-12-25 devnull
79 1544f909 2004-12-25 devnull c = chancreate(sizeof(ulong), nbuf);
80 1544f909 2004-12-25 devnull mk(countthread, c, STACK);
81 1544f909 2004-12-25 devnull mk(filterthread, c, STACK);
82 4dbefdd4 2004-12-27 devnull recvp(chancreate(sizeof(void*), 0));
83 fc567f47 2011-08-02 rsc threadexitsall(0);
84 1544f909 2004-12-25 devnull }
85 f6127ed2 2005-01-04 devnull
86 f6127ed2 2005-01-04 devnull void
87 f6127ed2 2005-01-04 devnull printmsg(void *v, char *msg)
88 f6127ed2 2005-01-04 devnull {
89 f6127ed2 2005-01-04 devnull print("note: %s\n", msg);
90 f6127ed2 2005-01-04 devnull }