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 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) 299a747e4fSDavid du Colombier sysfatal("open /dev/mouse: %r\en"); 309a747e4fSDavid du Colombier for(;;){ 31*c27b0bc9SDavid 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"); 35*c27b0bc9SDavid du Colombier send(mc, m); 369a747e4fSDavid du Colombier } 379a747e4fSDavid du Colombier } 389a747e4fSDavid du Colombier 399a747e4fSDavid du Colombier void 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 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); 67*c27b0bc9SDavid 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 */ 71*c27b0bc9SDavid 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