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