19a747e4fSDavid du Colombier /*
29a747e4fSDavid du Colombier Threadmain spawns two subprocesses, one
39a747e4fSDavid du Colombier to read the mouse, and one to receive
49a747e4fSDavid du Colombier timer events. The events are sent via a
59a747e4fSDavid du Colombier channel to the main proc which prints a
69a747e4fSDavid du Colombier word when an event comes in. When mouse
79a747e4fSDavid du Colombier button three is pressed, the application
89a747e4fSDavid du Colombier terminates.
99a747e4fSDavid du Colombier */
109a747e4fSDavid du Colombier
119a747e4fSDavid du Colombier #include <u.h>
129a747e4fSDavid du Colombier #include <libc.h>
139a747e4fSDavid du Colombier #include <thread.h>
149a747e4fSDavid du Colombier
159a747e4fSDavid du Colombier enum
169a747e4fSDavid du Colombier {
179a747e4fSDavid du Colombier STACK = 2048,
189a747e4fSDavid du Colombier };
199a747e4fSDavid du Colombier
209a747e4fSDavid du Colombier void
mouseproc(void * arg)219a747e4fSDavid du Colombier mouseproc(void *arg)
229a747e4fSDavid du Colombier {
239a747e4fSDavid du Colombier char m[48];
249a747e4fSDavid du Colombier int mfd;
259a747e4fSDavid du Colombier Channel *mc;
269a747e4fSDavid du Colombier
279a747e4fSDavid du Colombier mc = arg;
289a747e4fSDavid du Colombier if((mfd = open("/dev/mouse", OREAD)) < 0)
29*b7210bc5SDavid du Colombier sysfatal("open /dev/mouse: %r");
309a747e4fSDavid du Colombier for(;;){
31c27b0bc9SDavid du Colombier if(read(mfd, m, sizeof m) != sizeof m)
329a747e4fSDavid du Colombier sysfatal("eof");
339a747e4fSDavid du Colombier if(atoi(m+1+2*12)&4)
349a747e4fSDavid du Colombier sysfatal("button 3");
35c27b0bc9SDavid du Colombier send(mc, m);
369a747e4fSDavid du Colombier }
379a747e4fSDavid du Colombier }
389a747e4fSDavid du Colombier
399a747e4fSDavid du Colombier void
clockproc(void * arg)409a747e4fSDavid du Colombier clockproc(void *arg)
419a747e4fSDavid du Colombier {
429a747e4fSDavid du Colombier int t;
439a747e4fSDavid du Colombier Channel *c;
449a747e4fSDavid du Colombier
459a747e4fSDavid du Colombier c = arg;
469a747e4fSDavid du Colombier for(t=0;; t++){
479a747e4fSDavid du Colombier sleep(1000);
489a747e4fSDavid du Colombier sendul(c, t);
499a747e4fSDavid du Colombier }
509a747e4fSDavid du Colombier }
519a747e4fSDavid du Colombier
529a747e4fSDavid du Colombier
539a747e4fSDavid du Colombier void
threadmain(int argc,char * argv[])549a747e4fSDavid du Colombier threadmain(int argc, char *argv[])
559a747e4fSDavid du Colombier {
569a747e4fSDavid du Colombier char m[48];
579a747e4fSDavid du Colombier int t;
589a747e4fSDavid du Colombier Alt a[] = {
599a747e4fSDavid du Colombier /* c v op */
609a747e4fSDavid du Colombier {nil, m, CHANRCV},
619a747e4fSDavid du Colombier {nil, &t, CHANRCV},
629a747e4fSDavid du Colombier {nil, nil, CHANEND},
639a747e4fSDavid du Colombier };
649a747e4fSDavid du Colombier
659a747e4fSDavid du Colombier /* create mouse event channel and mouse process */
669a747e4fSDavid du Colombier a[0].c = chancreate(sizeof m, 0);
67c27b0bc9SDavid du Colombier proccreate(mouseproc, a[0].c, STACK);
689a747e4fSDavid du Colombier
699a747e4fSDavid du Colombier /* create clock event channel and clock process */
709a747e4fSDavid du Colombier a[1].c = chancreate(sizeof(ulong), 0); /* clock event channel */
71c27b0bc9SDavid du Colombier proccreate(clockproc, a[1].c, STACK);
729a747e4fSDavid du Colombier
739a747e4fSDavid du Colombier for(;;){
749a747e4fSDavid du Colombier switch(alt(a)){
759a747e4fSDavid du Colombier case 0: /*mouse event */
769a747e4fSDavid du Colombier fprint(2, "click ");
779a747e4fSDavid du Colombier break;
789a747e4fSDavid du Colombier case 1: /* clock event */
799a747e4fSDavid du Colombier fprint(2, "tic ");
809a747e4fSDavid du Colombier break;
819a747e4fSDavid du Colombier default:
829a747e4fSDavid du Colombier sysfatal("can't happen");
839a747e4fSDavid du Colombier }
849a747e4fSDavid du Colombier }
859a747e4fSDavid du Colombier }
86