Browse Source

external pager: add a pager file to proc; remove old mmap bits; set things up

pager is a better name than mmap.

It's an experimental idea but would make mmap a user level entity and hence
it could be far more flexible than it is on unix.

Change-Id: I0c2bae80ad8118546ab0f5a1c818ac38997ed561
Signed-off-by: Ronald G. Minnich <rminnich@gmail.com>
Ronald G. Minnich 8 years ago
parent
commit
c96459b310
1 changed files with 21 additions and 23 deletions
  1. 21 23
      sys/src/9/port/devproc.c

+ 21 - 23
sys/src/9/port/devproc.c

@@ -43,8 +43,8 @@ enum
 	Qprofile,
 	Qsyscall,
 	Qcore,
-	Qmmap,
 	Qtls,
+	Qpager,
 };
 
 enum
@@ -113,8 +113,8 @@ Dirtab procdir[] =
 	"profile",	{Qprofile},	0,			0400,
 	"syscall",	{Qsyscall},	0,			0400,
 	"core",		{Qcore},	0,			0444,
-	"mmap",		{Qmmap},	0,			0600,
-	"tls",		{Qtls},	0,			0600,
+	"tls",		{Qtls},		0,			0600,
+	"pager",	{Qpager},	0,			0600|DMEXCL,
 
 };
 
@@ -514,12 +514,9 @@ procopen(Chan *c, int omode)
 		nonone(p);
 		break;
 
-	case Qmmap:
-		//nonone(p);
-		if (! p->resp) { /* XXX need to do single reader/writer but that's later. */
-			p->resp = qopen(1024, Qmsg, nil, 0);
-			p->req = qopen(1024, Qmsg, nil, 0);
-		}
+	case Qpager:
+		p->resp = qopen(1024, Qmsg, nil, 0);
+		p->req = qopen(1024, Qmsg, nil, 0);
 		print("p %d sets resp %p req %p\n", p->pid, p->resp, p->req);
 		c->aux = p;
 		break;
@@ -727,8 +724,8 @@ procclose(Chan * c)
 			proctrace = notrace;
 		unlock(&tlock);
 	}
-	if(QID(c->qid) == Qmmap){
-		// fix me. Find proc for this file. p->mmap = nil;
+	if(QID(c->qid) == Qpager){
+		print("leaking queueus for pager\n");
 	}
 	if(QID(c->qid) == Qns && c->aux != 0)
 		free(c->aux);
@@ -876,12 +873,6 @@ procread(Chan *c, void *va, int32_t n, int64_t off)
 		free(statbuf);
 		return n;
 
-	case Qmmap:
-		p = c->aux;
-		n = qread(p->req, va, n);
-		print("read mmap: %p\n", n);
-		break;
-
 	case Qmem:
 		if(offset < KZERO || (offset >= USTKTOP-USTKSIZE && offset < USTKTOP)){
 			r = procctlmemio(p, offset, n, va, 1);
@@ -1062,7 +1053,7 @@ procread(Chan *c, void *va, int32_t n, int64_t off)
 		readnum(0, statbuf+j+NUMSIZE*14, NUMSIZE, p->nacsyscall, NUMSIZE);
 
 		/*
-		 * mmap support, random stuff.
+		 * external pager support, random stuff.
 		 */
 		if (0) print("qstatus p %p pid %d req %p\n", p, p->pid, p->req);
 		readnum(0,statbuf+j+NUMSIZE*15, NUMSIZE, p->req ? 1 : 0, NUMSIZE);
@@ -1207,6 +1198,12 @@ procread(Chan *c, void *va, int32_t n, int64_t off)
 		memmove(va, statbuf+offset, n);
 		free(statbuf);
 		return n;
+
+	case Qpager:
+		p = c->aux;
+		n = qread(p->req, va, n);
+		print("read pager: %p\n", n);
+		break;
 	}
 	error(Egreg);
 	return 0;			/* not reached */
@@ -1361,11 +1358,6 @@ procwrite(Chan *c, void *va, int32_t n, int64_t off)
 			error(Ebadarg);
 		break;
 
-	case Qmmap:
-		p = c->aux;
-		n = qwrite(p->resp, va, n);
-		break;
-
 	case Qtls:
 		if(n >= sizeof buf)
 			error(Etoobig);
@@ -1385,6 +1377,12 @@ procwrite(Chan *c, void *va, int32_t n, int64_t off)
 		}
 		error(Ebadarg);
 
+	case Qpager:
+		p = c->aux;
+		if (p && p->resp)
+			n = qwrite(p->resp, va, n);
+		break;
+
 	default:
 		poperror();
 		qunlock(&p->debug);