page: performance fixes
- fix showpage1 only decrementing proc counter once limit is reached; this blocked having more than one loadpages process after NPROC calls, since the next one has to wait until the last has exited - allow procs to skip pages currently being loaded by others; this forced processes to wait for each other at the same page - bump NPROC from 4 to 8 - (hack) immediately fork a few times after adding all pages at startup to force loading a batch of pages in parallel
This commit is contained in:
parent
aa14ba62fd
commit
9d43029ff9
|
@ -54,7 +54,7 @@ Image *frame, *paper, *ground;
|
||||||
char pagespool[] = "/tmp/pagespool.";
|
char pagespool[] = "/tmp/pagespool.";
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
NPROC = 4,
|
NPROC = 8,
|
||||||
NBUF = 8*1024,
|
NBUF = 8*1024,
|
||||||
NPATH = 1024,
|
NPATH = 1024,
|
||||||
};
|
};
|
||||||
|
@ -898,10 +898,6 @@ loadpage(Page *p)
|
||||||
{
|
{
|
||||||
int fd;
|
int fd;
|
||||||
|
|
||||||
qlock(&lru);
|
|
||||||
llinkhead(p);
|
|
||||||
qunlock(&lru);
|
|
||||||
|
|
||||||
if(p->open != nil && p->image == nil){
|
if(p->open != nil && p->image == nil){
|
||||||
fd = openpage(p);
|
fd = openpage(p);
|
||||||
if(fd >= 0){
|
if(fd >= 0){
|
||||||
|
@ -951,7 +947,11 @@ void
|
||||||
loadpages(Page *p, int oviewgen)
|
loadpages(Page *p, int oviewgen)
|
||||||
{
|
{
|
||||||
while(p != nil && viewgen == oviewgen){
|
while(p != nil && viewgen == oviewgen){
|
||||||
qlock(p);
|
qlock(&lru);
|
||||||
|
llinkhead(p);
|
||||||
|
qunlock(&lru);
|
||||||
|
if(!canqlock(p))
|
||||||
|
goto next;
|
||||||
loadpage(p);
|
loadpage(p);
|
||||||
if(viewgen != oviewgen){
|
if(viewgen != oviewgen){
|
||||||
unloadpage(p);
|
unloadpage(p);
|
||||||
|
@ -972,6 +972,7 @@ loadpages(Page *p, int oviewgen)
|
||||||
unlockdisplay(display);
|
unlockdisplay(display);
|
||||||
}
|
}
|
||||||
qunlock(p);
|
qunlock(p);
|
||||||
|
next:
|
||||||
if(p != current && imemsize >= imemlimit)
|
if(p != current && imemsize >= imemlimit)
|
||||||
break; /* only one page ahead once we reach the limit */
|
break; /* only one page ahead once we reach the limit */
|
||||||
if(forward < 0){
|
if(forward < 0){
|
||||||
|
@ -1309,16 +1310,17 @@ showpage1(Page *p)
|
||||||
writeaddr(p, "/dev/label");
|
writeaddr(p, "/dev/label");
|
||||||
current = p;
|
current = p;
|
||||||
oviewgen = viewgen;
|
oviewgen = viewgen;
|
||||||
|
if(nproc >= NPROC)
|
||||||
|
waitpid();
|
||||||
switch(rfork(RFPROC|RFMEM)){
|
switch(rfork(RFPROC|RFMEM)){
|
||||||
case -1:
|
case -1:
|
||||||
sysfatal("rfork: %r");
|
sysfatal("rfork: %r");
|
||||||
case 0:
|
case 0:
|
||||||
loadpages(p, oviewgen);
|
loadpages(p, oviewgen);
|
||||||
|
nproc--;
|
||||||
exits(nil);
|
exits(nil);
|
||||||
}
|
}
|
||||||
if(++nproc >= NPROC)
|
nproc++;
|
||||||
if(waitpid() > 0)
|
|
||||||
nproc--;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* recursive display lock, called from main proc only */
|
/* recursive display lock, called from main proc only */
|
||||||
|
@ -1691,6 +1693,8 @@ main(int argc, char *argv[])
|
||||||
addpage(root, "stdin", popenfile, strdup("/fd/0"), -1);
|
addpage(root, "stdin", popenfile, strdup("/fd/0"), -1);
|
||||||
for(; *argv; argv++)
|
for(; *argv; argv++)
|
||||||
addpage(root, *argv, popenfile, strdup(*argv), -1);
|
addpage(root, *argv, popenfile, strdup(*argv), -1);
|
||||||
|
for(i=0; i<NPROC/4; i++) /* rice */
|
||||||
|
showpage1(current);
|
||||||
|
|
||||||
drawlock(1);
|
drawlock(1);
|
||||||
for(;;){
|
for(;;){
|
||||||
|
|
Loading…
Reference in a new issue