From c88ed6488f36eaa7d499dac424f647d166267dec Mon Sep 17 00:00:00 2001 From: cinap_lenrek Date: Wed, 2 Jan 2019 10:26:38 +0100 Subject: upas/fs: don't put messages on the lru that cannot be uncached the lru is there to track least recently used messages so we can evict them from the cache and refetch them again on demand. for pop3 mailbox, which doesnt provide fetch routine, the messages should never be put on the freelist. --- sys/src/cmd/upas/fs/cache.c | 18 ++++++++++-------- sys/src/cmd/upas/fs/dat.h | 2 +- sys/src/cmd/upas/fs/mbox.c | 2 +- 3 files changed, 12 insertions(+), 10 deletions(-) diff --git a/sys/src/cmd/upas/fs/cache.c b/sys/src/cmd/upas/fs/cache.c index f7442e80c..5312886b3 100644 --- a/sys/src/cmd/upas/fs/cache.c +++ b/sys/src/cmd/upas/fs/cache.c @@ -3,13 +3,15 @@ #include "dat.h" static void -addlru(Mcache *c, Message *m) +addlru(Mailbox *c, Message *m) { Message *l, **ll; if((m->cstate & (Cheader|Cbody)) == 0) return; + assert(c->fetch != nil); + c->nlru++; ll = &c->lru; while((l = *ll) != nil){ @@ -35,12 +37,12 @@ notecache(Mailbox *mb, Message *m, long sz) } void -cachefree(Mailbox *mb, Message *m, int force) +cachefree(Mailbox *mb, Message *m) { long i; Message *s, **ll; - if(Topmsg(mb, m)){ + if(Topmsg(mb, m) && mb->fetch != nil){ for(ll = &mb->lru; *ll != nil; ll = &((*ll)->lru)){ if(*ll == m){ mb->nlru--; @@ -49,14 +51,12 @@ cachefree(Mailbox *mb, Message *m, int force) break; } } - if(mb->decache) + if(mb->decache != nil) mb->decache(mb, m); mb->cached -= m->csize; } for(s = m->part; s; s = s->next) - cachefree(mb, s, force); - if(!force && mb->fetch == nil) - return; + cachefree(mb, s); if(m->mallocd){ free(m->start); m->mallocd = 0; @@ -94,6 +94,8 @@ putcache(Mailbox *mb, Message *m) { int n; + if(mb->fetch == nil) + return; while(!Topmsg(mb, m)) m = m->whole; addlru(mb, m); while(mb->lru != nil && (mb->cached > cachetarg || mb->nlru > 10)){ @@ -103,7 +105,7 @@ putcache(Mailbox *mb, Message *m) return; addlru(mb, mb->lru); } - cachefree(mb, mb->lru, 0); + cachefree(mb, mb->lru); } } diff --git a/sys/src/cmd/upas/fs/dat.h b/sys/src/cmd/upas/fs/dat.h index 67f11bb98..d25656b0c 100644 --- a/sys/src/cmd/upas/fs/dat.h +++ b/sys/src/cmd/upas/fs/dat.h @@ -207,7 +207,7 @@ int insurecache(Mailbox*, Message*); /**/ void putcache(Mailbox*, Message*); /* asymmetricial */ -void cachefree(Mailbox*, Message*, int); +void cachefree(Mailbox*, Message*); char* syncmbox(Mailbox*, int); void* emalloc(ulong); diff --git a/sys/src/cmd/upas/fs/mbox.c b/sys/src/cmd/upas/fs/mbox.c index 044c4b091..b83014ec0 100644 --- a/sys/src/cmd/upas/fs/mbox.c +++ b/sys/src/cmd/upas/fs/mbox.c @@ -1041,7 +1041,7 @@ delmessage(Mailbox *mb, Message *m) if(Topmsg(mb, m)) mtreedelete(mb, m); - cachefree(mb, m, 1); + cachefree(mb, m); idxfree(m); } free(m->unixfrom); -- cgit v1.2.3