page: maintain a lru list and do unloading from oldest to newest
This commit is contained in:
parent
79b16616d7
commit
631ac3d2e2
1 changed files with 30 additions and 5 deletions
|
@ -22,6 +22,9 @@ struct Page {
|
||||||
Page *next;
|
Page *next;
|
||||||
Page *down;
|
Page *down;
|
||||||
Page *tail;
|
Page *tail;
|
||||||
|
|
||||||
|
Page *lnext;
|
||||||
|
Page *lprev;
|
||||||
};
|
};
|
||||||
|
|
||||||
int zoom = 1;
|
int zoom = 1;
|
||||||
|
@ -32,6 +35,7 @@ int rotate;
|
||||||
int viewgen;
|
int viewgen;
|
||||||
Point resize, pos;
|
Point resize, pos;
|
||||||
Page *root, *current;
|
Page *root, *current;
|
||||||
|
Page lru;
|
||||||
QLock pagelock;
|
QLock pagelock;
|
||||||
int nullfd;
|
int nullfd;
|
||||||
|
|
||||||
|
@ -137,10 +141,6 @@ addpage(Page *up, char *label, int (*popen)(Page *), void *pdata, int fd)
|
||||||
p->open = popen;
|
p->open = popen;
|
||||||
p->fd = fd;
|
p->fd = fd;
|
||||||
|
|
||||||
p->down = nil;
|
|
||||||
p->tail = nil;
|
|
||||||
p->next = nil;
|
|
||||||
|
|
||||||
qlock(&pagelock);
|
qlock(&pagelock);
|
||||||
if(p->up = up){
|
if(p->up = up){
|
||||||
if(up->tail == nil)
|
if(up->tail == nil)
|
||||||
|
@ -829,11 +829,30 @@ imagesize(Image *i)
|
||||||
return Dy(i->r)*bytesperline(i->r, i->depth);
|
return Dy(i->r)*bytesperline(i->r, i->depth);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
lunlink(Page *p)
|
||||||
|
{
|
||||||
|
if(p->lnext == nil || p->lnext == p)
|
||||||
|
return;
|
||||||
|
p->lnext->lprev = p->lprev;
|
||||||
|
p->lprev->lnext = p->lnext;
|
||||||
|
p->lnext = nil;
|
||||||
|
p->lprev = nil;
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
loadpage(Page *p)
|
loadpage(Page *p)
|
||||||
{
|
{
|
||||||
int fd;
|
int fd;
|
||||||
|
|
||||||
|
qlock(&lru);
|
||||||
|
lunlink(p);
|
||||||
|
p->lnext = lru.lnext;
|
||||||
|
p->lprev = &lru;
|
||||||
|
p->lnext->lprev = p;
|
||||||
|
p->lprev->lnext = p;
|
||||||
|
qunlock(&lru);
|
||||||
|
|
||||||
if(p->open && p->image == nil){
|
if(p->open && p->image == nil){
|
||||||
fd = openpage(p);
|
fd = openpage(p);
|
||||||
if(fd >= 0){
|
if(fd >= 0){
|
||||||
|
@ -854,6 +873,10 @@ loadpage(Page *p)
|
||||||
void
|
void
|
||||||
unloadpage(Page *p)
|
unloadpage(Page *p)
|
||||||
{
|
{
|
||||||
|
qlock(&lru);
|
||||||
|
lunlink(p);
|
||||||
|
qunlock(&lru);
|
||||||
|
|
||||||
if(p->open == nil || p->image == nil)
|
if(p->open == nil || p->image == nil)
|
||||||
return;
|
return;
|
||||||
lockdisplay(display);
|
lockdisplay(display);
|
||||||
|
@ -868,7 +891,7 @@ unloadpages(ulong limit)
|
||||||
{
|
{
|
||||||
Page *p;
|
Page *p;
|
||||||
|
|
||||||
for(p = root->down; p && imemsize >= limit; p = nextpage(p)){
|
while(imemsize >= limit && (p = lru.lprev) != &lru){
|
||||||
qlock(p);
|
qlock(p);
|
||||||
unloadpage(p);
|
unloadpage(p);
|
||||||
qunlock(p);
|
qunlock(p);
|
||||||
|
@ -1500,6 +1523,8 @@ main(int argc, char *argv[])
|
||||||
memset(&m, 0, sizeof(m));
|
memset(&m, 0, sizeof(m));
|
||||||
if((nullfd = open("/dev/null", ORDWR)) < 0)
|
if((nullfd = open("/dev/null", ORDWR)) < 0)
|
||||||
sysfatal("open: %r");
|
sysfatal("open: %r");
|
||||||
|
lru.lprev = &lru;
|
||||||
|
lru.lnext = &lru;
|
||||||
current = root = addpage(nil, "", nil, nil, -1);
|
current = root = addpage(nil, "", nil, nil, -1);
|
||||||
if(*argv == nil && !imode)
|
if(*argv == nil && !imode)
|
||||||
addpage(root, "stdin", popenfile, strdup("/fd/0"), -1);
|
addpage(root, "stdin", popenfile, strdup("/fd/0"), -1);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue