henesyinit from p9f0ed2a895 years agoHistory
151 lines · 2.4 KB · C
RawDownload
#include <u.h>#include <libc.h>#include <thread.h> #define STACKSIZE (32*1024) int count; Channel *stopchan; voiderror(char *fmt, ...){	int n;	va_list arg; 	threadprint(2, fmt, arg);	threadkillall();	threadexits("error");} voidchansendproc(void *ch) {	Channel**c = ch;	long v; 	for (v = 1; v <= count; v++) {		send(c[0], &v);		recv(c[1], &v);	}	send(stopchan, &v);} voidchanrecvproc(void *ch) {	Channel**c = ch;	long v = 0; 	for (;;) {		recv(c[0], &v);		send(c[1], &v);		if (v == count) break;	}	send(stopchan, &v);} voidpipesendproc(void *ch) {	int *p = ch;	long v; 	for (v = 1; v <= count; v++) {		write(p[1], &v, sizeof(v));		read(p[1], &v, sizeof(v));	}	send(stopchan, &v);} voidpiperecvproc(void *ch) {	int *p = ch;	long v = 0; 	for (;;) {		read(p[0], &v, sizeof(v));		write(p[0], &v, sizeof(v));		if (v == count) break;	}	send(stopchan, &v);} voidyieldproc(void *) {	long i; 	for (i = 0; i < count; i++) {		yield();	}	send(stopchan, &i);} voidchanmain(int argc, char *argv[]) {	Channel *c[2];	long done; 	count = atoi(argv[1]); 	c[0] = chancreate(sizeof(long), 0);	c[1] = chancreate(sizeof(long), 0);	stopchan = chancreate(sizeof(long), 0);	proccreate(chansendproc, (void *)c, STACKSIZE);	proccreate(chanrecvproc, (void *)c, STACKSIZE);	recv(stopchan, &done);	recv(stopchan, &done);} voidthreadchanmain(int argc, char *argv[]) {	Channel *c[2];	long done; 	count = atoi(argv[1]); 	c[0] = chancreate(sizeof(long), 0);	c[1] = chancreate(sizeof(long), 0);	stopchan = chancreate(sizeof(long), 0);	threadcreate(chansendproc, (void *)c, STACKSIZE);	threadcreate(chanrecvproc, (void *)c, STACKSIZE);	recv(stopchan, &done);	recv(stopchan, &done);} voidpipemain(int argc, char *argv[]) {	int p[2];	long done; 	count = atoi(argv[1]); 	pipe(p);	stopchan = chancreate(sizeof(long), 0);	proccreate(pipesendproc, (void *)p, STACKSIZE);	proccreate(piperecvproc, (void *)p, STACKSIZE);	recv(stopchan, &done);	recv(stopchan, &done);} voidyieldmain(int argc, char *argv[]) {	Channel *c[2];	long done; 	count = atoi(argv[1]); 	stopchan = chancreate(sizeof(long), 0);	threadcreate(yieldproc, nil, STACKSIZE);	threadcreate(yieldproc, nil, STACKSIZE);	recv(stopchan, &done);	recv(stopchan, &done);} voidthreadmain(int argc, char *argv[]) { //	chanmain(argc, argv);//	pipemain(argc, argv);//	threadchanmain(argc, argv);	yieldmain(argc, argv);	exits(0);}