summaryrefslogtreecommitdiff
path: root/sys/src/cmd/page.c
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@gmx.de>2013-08-03 17:37:20 +0200
committercinap_lenrek <cinap_lenrek@gmx.de>2013-08-03 17:37:20 +0200
commit631ac3d2e229835e15d5c5e9906d118c19f1c0c1 (patch)
tree4f8a962626e312273948afbab768ea1a09245eb7 /sys/src/cmd/page.c
parent79b16616d7a4dd7038dc3b3a5a72beb51efa7b03 (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.c35
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);