]> git.lizzy.rs Git - plan9front.git/blob - sys/src/libthread/iocall.c
libthread: make ioproc even when opening /proc/n/ctl fails (factotum)
[plan9front.git] / sys / src / libthread / iocall.c
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         Iocall r;
10
11         r.op = op;
12         va_start(r.arg, op);
13         if(sendp(io->c, &r) < 0){
14                 werrstr("interrupted");
15                 return -1;
16         }
17         while(recv(io->creply, nil) < 0){
18                 if(io->ctl < 0)
19                         continue;
20                 if(canqlock(io)){
21                         if(++io->intr == 1)
22                                 write(io->ctl, "interrupt", 9);
23                         qunlock(io);
24                 }
25         }
26         va_end(r.arg);
27         if(r.ret < 0)
28                 errstr(r.err, sizeof r.err);
29         return r.ret;
30 }