Blame


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