1 #include <u.h> 2 #include <libc.h> 3 #include <thread.h> 4 #include "threadimpl.h" 5 6 long 7 iocall(Ioproc *io, long (*op)(va_list*), ...) 8 { 9 int ret, inted; 10 Ioproc *msg; 11 12 if(send(io->c, &io) == -1){ 13 werrstr("interrupted"); 14 return -1; 15 } 16 assert(!io->inuse); 17 io->inuse = 1; 18 io->op = op; 19 va_start(io->arg, op); 20 msg = io; 21 inted = 0; 22 while(send(io->creply, &msg) == -1){ 23 msg = nil; 24 inted = 1; 25 } 26 if(inted){ 27 werrstr("interrupted"); 28 return -1; 29 } 30 31 /* 32 * If we get interrupted, we have to stick around so that 33 * the IO proc has someone to talk to. Send it an interrupt 34 * and try again. 35 */ 36 inted = 0; 37 while(recv(io->creply, nil) == -1){ 38 inted = 1; 39 iointerrupt(io); 40 } 41 USED(inted); 42 va_end(io->arg); 43 ret = io->ret; 44 if(ret < 0) 45 errstr(io->err, sizeof io->err); 46 io->inuse = 0; 47 48 /* release resources */ 49 while(send(io->creply, &io) == -1) 50 ; 51 return ret; 52 } 53