git: 9front

Download patch

ref: fe91fdbedd67e820d2e9d2ded611c81c84ea4f17
parent: 465ac6272351ea2ed676b35da462269046487943
author: cinap_lenrek <cinap_lenrek@gmx.de>
date: Tue Apr 3 18:10:19 EDT 2012

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

--- a/sys/src/libthread/iocall.c
+++ b/sys/src/libthread/iocall.c
@@ -15,6 +15,8 @@
 		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);
--- a/sys/src/libthread/ioproc.c
+++ b/sys/src/libthread/ioproc.c
@@ -11,6 +11,8 @@
 void
 iointerrupt(Ioproc *io)
 {
+	if(io->ctl < 0)
+		return;
 	qlock(io);
 	if(++io->intr == 1)
 		write(io->ctl, "interrupt", 9);
@@ -28,18 +30,20 @@
 	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,7 +63,8 @@
 		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)
 			;
@@ -66,7 +71,8 @@
 		qunlock(io);
 	}
 
-	close(io->ctl);
+	if(io->ctl >= 0)
+		close(io->ctl);
 	chanfree(io->c);
 	chanfree(io->creply);
 	free(io);
--