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