]> git.lizzy.rs Git - plan9front.git/blobdiff - sys/src/lib9p/srv.c
kernel: avoid useless mmu flushes, implement better wait condition for procflushmmu()
[plan9front.git] / sys / src / lib9p / srv.c
index ddecfa6e2d1ff140ba92bf0cf25b5c55a9168fe5..207c88f618644a9e4f3827995e245abd9309ba79 100644 (file)
@@ -59,9 +59,8 @@ getreq(Srv *s)
        Req *r;
 
        qlock(&s->rlock);
-       while((n = read9pmsg(s->infd, s->rbuf, s->msize)) == 0)
-               ;
-       if(n < 0){
+       n = read9pmsg(s->infd, s->rbuf, s->msize);
+       if(n <= 0){
                qunlock(&s->rlock);
                return nil;
        }
@@ -173,6 +172,7 @@ sversion(Srv *srv, Req *r)
        }
        if(strncmp(r->ifcall.version, "9P", 2) != 0){
                r->ofcall.version = "unknown";
+               r->ofcall.msize = 256;
                respond(r, nil);
                return;
        }
@@ -513,7 +513,7 @@ sread(Srv *srv, Req *r)
                return;
        }
        if((r->fid->qid.type&QTDIR) && r->fid->file){
-               r->ofcall.count = readdirfile(r->fid->rdir, r->rbuf, r->ifcall.count);
+               r->ofcall.count = readdirfile(r->fid->rdir, r->rbuf, r->ifcall.count, r->ifcall.offset);
                respond(r, nil);
                return;
        }
@@ -526,7 +526,7 @@ static void
 rread(Req *r, char *error)
 {
        if(error==nil && (r->fid->qid.type&QTDIR))
-               r->fid->diroffset += r->ofcall.count;
+               r->fid->diroffset = r->ifcall.offset + r->ofcall.count;
 }
 
 static void
@@ -749,6 +749,11 @@ srvwork(void *v)
                case Tstat:     sstat(srv, r);  break;
                case Twstat:    swstat(srv, r); break;
                }
+               if(srv->sref.ref > 8 && srv->spid != getpid()){
+                       decref(&srv->sref);
+                       qunlock(&srv->slock);
+                       return;
+               }
                qunlock(&srv->slock);
        }
 
@@ -804,6 +809,7 @@ srv(Srv *srv)
        fmtinstall('D', dirfmt);
        fmtinstall('F', fcallfmt);
 
+       srv->spid = getpid();
        srv->sref.ref = 0;
        srv->rref.ref = 0;