xref: /plan9/sys/src/libthread/iocall.c (revision 3ff48bf5ed603850fcd251ddf13025d23d693782)
1*3ff48bf5SDavid du Colombier #include <u.h>
2*3ff48bf5SDavid du Colombier #include <libc.h>
3*3ff48bf5SDavid du Colombier #include <thread.h>
4*3ff48bf5SDavid du Colombier #include "threadimpl.h"
5*3ff48bf5SDavid du Colombier 
6*3ff48bf5SDavid du Colombier long
7*3ff48bf5SDavid du Colombier iocall(Ioproc *io, long (*op)(va_list*), ...)
8*3ff48bf5SDavid du Colombier {
9*3ff48bf5SDavid du Colombier 	int ret;
10*3ff48bf5SDavid du Colombier 
11*3ff48bf5SDavid du Colombier 	assert(!io->inuse);
12*3ff48bf5SDavid du Colombier 	io->inuse = 1;
13*3ff48bf5SDavid du Colombier 	io->op = op;
14*3ff48bf5SDavid du Colombier 	va_start(io->arg, op);
15*3ff48bf5SDavid du Colombier 	sendp(io->c, io);
16*3ff48bf5SDavid du Colombier 	recvp(io->c);
17*3ff48bf5SDavid du Colombier 	va_end(io->arg);
18*3ff48bf5SDavid du Colombier 	ret = io->ret;
19*3ff48bf5SDavid du Colombier 	if(ret < 0)
20*3ff48bf5SDavid du Colombier 		errstr(io->err, sizeof io->err);
21*3ff48bf5SDavid du Colombier 	io->inuse = 0;
22*3ff48bf5SDavid du Colombier 	return ret;
23*3ff48bf5SDavid du Colombier }
24