diff options
author | cinap_lenrek <cinap_lenrek@localhost> | 2011-08-22 03:03:27 +0200 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@localhost> | 2011-08-22 03:03:27 +0200 |
commit | 08c39320a46ad94fba9ba3310444f136dd9258f5 (patch) | |
tree | 4b98ada862770a8734f0c72240f7bab4a28c8d31 /sys/src/libthread/iocall.c | |
parent | 9a90e50142c792fdc06dc4faa8a582f441124aad (diff) |
libthread: reimplemented i/o procs using new interrupt ctl message
Diffstat (limited to 'sys/src/libthread/iocall.c')
-rw-r--r-- | sys/src/libthread/iocall.c | 52 |
1 files changed, 14 insertions, 38 deletions
diff --git a/sys/src/libthread/iocall.c b/sys/src/libthread/iocall.c index 4035c40f8..36c970806 100644 --- a/sys/src/libthread/iocall.c +++ b/sys/src/libthread/iocall.c @@ -6,47 +6,23 @@ long iocall(Ioproc *io, long (*op)(va_list*), ...) { - int ret, inted; - Ioproc *msg; + Iocall r; - if(send(io->c, &io) == -1){ + r.op = op; + va_start(r.arg, op); + if(sendp(io->c, &r) < 0){ werrstr("interrupted"); return -1; } - assert(!io->inuse); - io->inuse = 1; - io->op = op; - va_start(io->arg, op); - msg = io; - inted = 0; - while(send(io->creply, &msg) == -1){ - msg = nil; - inted = 1; + while(recv(io->creply, nil) < 0){ + if(canqlock(io)){ + if(++io->intr == 1) + write(io->ctl, "interrupt", 9); + qunlock(io); + } } - if(inted){ - werrstr("interrupted"); - return -1; - } - - /* - * If we get interrupted, we have to stick around so that - * the IO proc has someone to talk to. Send it an interrupt - * and try again. - */ - inted = 0; - while(recv(io->creply, nil) == -1){ - inted = 1; - iointerrupt(io); - } - USED(inted); - va_end(io->arg); - ret = io->ret; - if(ret < 0) - errstr(io->err, sizeof io->err); - io->inuse = 0; - - /* release resources */ - while(send(io->creply, &io) == -1) - ; - return ret; + va_end(r.arg); + if(r.ret < 0) + errstr(r.err, sizeof r.err); + return r.ret; } |