libthread: make ioproc even when opening /proc/n/ctl fails (factotum)

This commit is contained in:
cinap_lenrek 2012-04-03 22:10:19 +02:00
parent 0989c2530d
commit 37606a6b29
2 changed files with 19 additions and 11 deletions

View file

@ -15,6 +15,8 @@ iocall(Ioproc *io, long (*op)(va_list*), ...)
return -1; return -1;
} }
while(recv(io->creply, nil) < 0){ while(recv(io->creply, nil) < 0){
if(io->ctl < 0)
continue;
if(canqlock(io)){ if(canqlock(io)){
if(++io->intr == 1) if(++io->intr == 1)
write(io->ctl, "interrupt", 9); write(io->ctl, "interrupt", 9);

View file

@ -11,6 +11,8 @@ enum
void void
iointerrupt(Ioproc *io) iointerrupt(Ioproc *io)
{ {
if(io->ctl < 0)
return;
qlock(io); qlock(io);
if(++io->intr == 1) if(++io->intr == 1)
write(io->ctl, "interrupt", 9); write(io->ctl, "interrupt", 9);
@ -28,18 +30,20 @@ xioproc(void *a)
if(io = mallocz(sizeof(*io), 1)){ if(io = mallocz(sizeof(*io), 1)){
char buf[128]; 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()); 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); free(io);
io = nil; io = nil;
} else { } else
if((io->creply = chancreate(sizeof(void*), 0)) == nil){ io->c = c;
close(io->ctl);
free(io);
io = nil;
} else
io->c = c;
}
} }
while(send(c, &io) < 0) while(send(c, &io) < 0)
; ;
@ -59,14 +63,16 @@ xioproc(void *a)
qlock(io); qlock(io);
if(io->intr){ if(io->intr){
io->intr = 0; io->intr = 0;
write(io->ctl, "nointerrupt", 11); if(io->ctl >= 0)
write(io->ctl, "nointerrupt", 11);
} }
while(send(io->creply, &r) < 0) while(send(io->creply, &r) < 0)
; ;
qunlock(io); qunlock(io);
} }
close(io->ctl); if(io->ctl >= 0)
close(io->ctl);
chanfree(io->c); chanfree(io->c);
chanfree(io->creply); chanfree(io->creply);
free(io); free(io);