diff options
author | cinap_lenrek <cinap_lenrek@gmx.de> | 2013-08-03 17:37:20 +0200 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@gmx.de> | 2013-08-03 17:37:20 +0200 |
commit | 631ac3d2e229835e15d5c5e9906d118c19f1c0c1 (patch) | |
tree | 4f8a962626e312273948afbab768ea1a09245eb7 /sys/src/cmd/page.c | |
parent | 79b16616d7a4dd7038dc3b3a5a72beb51efa7b03 (diff) |
page: maintain a lru list and do unloading from oldest to newest
Diffstat (limited to 'sys/src/cmd/page.c')
-rw-r--r-- | sys/src/cmd/page.c | 35 |
1 files changed, 30 insertions, 5 deletions
diff --git a/sys/src/cmd/page.c b/sys/src/cmd/page.c index a4e23d17d..42584916f 100644 --- a/sys/src/cmd/page.c +++ b/sys/src/cmd/page.c @@ -22,6 +22,9 @@ struct Page { Page *next; Page *down; Page *tail; + + Page *lnext; + Page *lprev; }; int zoom = 1; @@ -32,6 +35,7 @@ int rotate; int viewgen; Point resize, pos; Page *root, *current; +Page lru; QLock pagelock; int nullfd; @@ -137,10 +141,6 @@ addpage(Page *up, char *label, int (*popen)(Page *), void *pdata, int fd) p->open = popen; p->fd = fd; - p->down = nil; - p->tail = nil; - p->next = nil; - qlock(&pagelock); if(p->up = up){ if(up->tail == nil) @@ -829,11 +829,30 @@ imagesize(Image *i) 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 loadpage(Page *p) { 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){ fd = openpage(p); if(fd >= 0){ @@ -854,6 +873,10 @@ loadpage(Page *p) void unloadpage(Page *p) { + qlock(&lru); + lunlink(p); + qunlock(&lru); + if(p->open == nil || p->image == nil) return; lockdisplay(display); @@ -868,7 +891,7 @@ unloadpages(ulong limit) { Page *p; - for(p = root->down; p && imemsize >= limit; p = nextpage(p)){ + while(imemsize >= limit && (p = lru.lprev) != &lru){ qlock(p); unloadpage(p); qunlock(p); @@ -1500,6 +1523,8 @@ main(int argc, char *argv[]) memset(&m, 0, sizeof(m)); if((nullfd = open("/dev/null", ORDWR)) < 0) sysfatal("open: %r"); + lru.lprev = &lru; + lru.lnext = &lru; current = root = addpage(nil, "", nil, nil, -1); if(*argv == nil && !imode) addpage(root, "stdin", popenfile, strdup("/fd/0"), -1); |