]> git.lizzy.rs Git - plan9front.git/blob - sys/src/libthread/example.c
vmx: clean up mksegment, memset only if segment existed (devsegment clears new ones)
[plan9front.git] / sys / src / libthread / example.c
1 /*
2 Threadmain spawns two subprocesses, one
3 to read the mouse, and one to receive
4 timer events.  The events are sent via a
5 channel to the main proc which prints a
6 word when an event comes in.  When mouse
7 button three is pressed, the application
8 terminates.
9 */
10
11 #include <u.h>
12 #include <libc.h>
13 #include <thread.h>
14
15 enum
16 {
17         STACK = 2048,
18 };
19
20 void
21 mouseproc(void *arg)
22 {
23         char m[48];
24         int mfd;
25         Channel *mc;
26
27         mc = arg;
28         if((mfd = open("/dev/mouse", OREAD)) < 0)
29                 sysfatal("open /dev/mouse: %r");
30         for(;;){
31                 if(read(mfd, m, sizeof m) != sizeof m)
32                         sysfatal("eof");
33                 if(atoi(m+1+2*12)&4)
34                         sysfatal("button 3");
35                 send(mc, m);
36         }
37 }
38
39 void
40 clockproc(void *arg)
41 {
42         int t;
43         Channel *c;
44
45         c = arg;
46         for(t=0;; t++){
47                 sleep(1000);
48                 sendul(c, t);
49         }
50 }
51
52
53 void
54 threadmain(int argc, char *argv[])
55 {
56         char m[48];
57         int t;
58         Alt a[] = {
59         /*       c              v               op   */
60                 {nil,   m,      CHANRCV},
61                 {nil,   &t,     CHANRCV},
62                 {nil,   nil,    CHANEND},
63         };
64
65         /* create mouse event channel and mouse process */
66         a[0].c = chancreate(sizeof m, 0);
67         proccreate(mouseproc, a[0].c, STACK);
68
69         /* create clock event channel and clock process */
70         a[1].c = chancreate(sizeof(ulong), 0);  /* clock event channel */
71         proccreate(clockproc, a[1].c, STACK);
72
73         for(;;){
74                 switch(alt(a)){
75                 case 0: /*mouse event */
76                         fprint(2, "click ");
77                         break;
78                 case 1: /* clock event */
79                         fprint(2, "tic ");
80                         break;
81                 default:
82                         sysfatal("can't happen");
83                 }
84         }
85 }