xref: /plan9/sys/src/libthread/example.c (revision b7210bc549e75a1a17e6f50cf11593c9cd7800bf)
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