summaryrefslogtreecommitdiff
path: root/sys/src/libthread/iocall.c
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@localhost>2011-08-22 03:03:27 +0200
committercinap_lenrek <cinap_lenrek@localhost>2011-08-22 03:03:27 +0200
commit08c39320a46ad94fba9ba3310444f136dd9258f5 (patch)
tree4b98ada862770a8734f0c72240f7bab4a28c8d31 /sys/src/libthread/iocall.c
parent9a90e50142c792fdc06dc4faa8a582f441124aad (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.c52
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;
}