summaryrefslogtreecommitdiff
path: root/sys/src/libthread
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@gmx.de>2012-04-03 22:10:19 +0200
committercinap_lenrek <cinap_lenrek@gmx.de>2012-04-03 22:10:19 +0200
commit37606a6b2907202b33e893e018b18c13cee3941f (patch)
tree435f3396d3a9ab33564a9f8964284d9e0ada5e16 /sys/src/libthread
parent0989c2530d03de81c7d340e2f173786590ae967b (diff)
libthread: make ioproc even when opening /proc/n/ctl fails (factotum)
Diffstat (limited to 'sys/src/libthread')
-rw-r--r--sys/src/libthread/iocall.c2
-rw-r--r--sys/src/libthread/ioproc.c28
2 files changed, 19 insertions, 11 deletions
diff --git a/sys/src/libthread/iocall.c b/sys/src/libthread/iocall.c
index 36c970806..94b2cced2 100644
--- a/sys/src/libthread/iocall.c
+++ b/sys/src/libthread/iocall.c
@@ -15,6 +15,8 @@ iocall(Ioproc *io, long (*op)(va_list*), ...)
return -1;
}
while(recv(io->creply, nil) < 0){
+ if(io->ctl < 0)
+ continue;
if(canqlock(io)){
if(++io->intr == 1)
write(io->ctl, "interrupt", 9);
diff --git a/sys/src/libthread/ioproc.c b/sys/src/libthread/ioproc.c
index 8a02e23e0..32be31026 100644
--- a/sys/src/libthread/ioproc.c
+++ b/sys/src/libthread/ioproc.c
@@ -11,6 +11,8 @@ enum
void
iointerrupt(Ioproc *io)
{
+ if(io->ctl < 0)
+ return;
qlock(io);
if(++io->intr == 1)
write(io->ctl, "interrupt", 9);
@@ -28,18 +30,20 @@ xioproc(void *a)
if(io = mallocz(sizeof(*io), 1)){
char buf[128];
+ /*
+ * open might fail, ignore it for programs like factotum
+ * that don't use iointerrupt() anyway.
+ */
snprint(buf, sizeof(buf), "/proc/%d/ctl", getpid());
- if((io->ctl = open(buf, OWRITE)) < 0){
+ io->ctl = open(buf, OWRITE);
+
+ if((io->creply = chancreate(sizeof(void*), 0)) == nil){
+ if(io->ctl >= 0)
+ close(io->ctl);
free(io);
io = nil;
- } else {
- if((io->creply = chancreate(sizeof(void*), 0)) == nil){
- close(io->ctl);
- free(io);
- io = nil;
- } else
- io->c = c;
- }
+ } else
+ io->c = c;
}
while(send(c, &io) < 0)
;
@@ -59,14 +63,16 @@ xioproc(void *a)
qlock(io);
if(io->intr){
io->intr = 0;
- write(io->ctl, "nointerrupt", 11);
+ if(io->ctl >= 0)
+ write(io->ctl, "nointerrupt", 11);
}
while(send(io->creply, &r) < 0)
;
qunlock(io);
}
- close(io->ctl);
+ if(io->ctl >= 0)
+ close(io->ctl);
chanfree(io->c);
chanfree(io->creply);
free(io);