git: 9front

Download patch

ref: 5a5345100bae3d0af7c7cd4ce685cb85a04584bf
parent: 88a50d9fa62013b67948f17456f030e113652262
author: aiju <aiju@phicode.de>
date: Sat Aug 20 08:30:06 EDT 2011

added interrupt proc ctl message

--- a/sys/include/9p.h
+++ b/sys/include/9p.h
@@ -44,7 +44,7 @@
 	QLock;
 	Rendez;
 	Queueelem;
-	int pid;
+	int pid, flush;
 	Req *cur;
 };
 
--- a/sys/src/9/port/devproc.c
+++ b/sys/src/9/port/devproc.c
@@ -53,6 +53,8 @@
 	CMwaitstop,
 	CMwired,
 	CMtrace,
+	CMinterrupt,
+	CMnointerrupt,
 	/* real time */
 	CMperiod,
 	CMdeadline,
@@ -118,6 +120,8 @@
 	CMwaitstop,		"waitstop",		1,
 	CMwired,		"wired",		2,
 	CMtrace,		"trace",		0,
+	CMinterrupt,		"interrupt",		1,
+	CMnointerrupt,		"nointerrupt",		1,
 	CMperiod,		"period",		2,
 	CMdeadline,		"deadline",		2,
 	CMcost,			"cost",			2,
@@ -1413,6 +1417,15 @@
 		default:
 			error("args");
 		}
+		break;
+	case CMinterrupt:
+		postnote(p, 0, nil, NUser);
+		break;
+	case CMnointerrupt:
+		if(p->nnote == 0)
+			p->notepending = 0;
+		else
+			error("notes pending");
 		break;
 	/* real time */
 	case CMperiod:
--- a/sys/src/9/port/proc.c
+++ b/sys/src/9/port/proc.c
@@ -904,11 +904,11 @@
 	if(dolock)
 		qlock(&p->debug);
 
-	if(flag != NUser && (p->notify == 0 || p->notified))
+	if(n != nil && flag != NUser && (p->notify == 0 || p->notified))
 		p->nnote = 0;
 
 	ret = 0;
-	if(p->nnote < NNOTE) {
+	if(p->nnote < NNOTE && n != nil) {
 		strcpy(p->note[p->nnote].msg, n);
 		p->note[p->nnote++].flag = flag;
 		ret = 1;
--- a/sys/src/lib9p/queue.c
+++ b/sys/src/lib9p/queue.c
@@ -4,12 +4,6 @@
 #include <fcall.h>
 #include <9p.h>
 
-static int
-_reqqueuenote(void *, char *note)
-{
-	return strcmp(note, "flush") == 0;
-}
-
 static void
 _reqqueueproc(void *v)
 {
@@ -16,12 +10,21 @@
 	Reqqueue *q;
 	Req *r;
 	void (*f)(Req *);
+	int fd;
+	char *buf;
 	
 	q = v;
 	rfork(RFNOTEG);
-	threadnotify(_reqqueuenote, 1);
+	
+	buf = smprint("/proc/%d/ctl", getpid());
+	fd = open(buf, OWRITE);
+	free(buf);
+	
 	for(;;){
 		qlock(q);
+		q->flush = 0;
+		if(fd >= 0)
+			write(fd, "nointerrupt", 11);
 		q->cur = nil;
 		while(q->next == q)
 			rsleep(q);
@@ -65,9 +68,18 @@
 void
 reqqueueflush(Reqqueue *q, Req *r)
 {
+	char buf[128];
+	int fd;
+
 	qlock(q);
 	if(q->cur == r){
-		postnote(PNPROC, q->pid, "flush");
+		sprint(buf, "/proc/%d/ctl", q->pid);
+		fd = open(buf, OWRITE);
+		if(fd >= 0){
+			write(fd, "interrupt", 9);
+			close(fd);
+		}
+		q->flush++;
 		qunlock(q);
 	}else{
 		if(r->qu.next != nil){
--