diff options
author | cinap_lenrek <cinap_lenrek@felloff.net> | 2019-01-02 10:26:38 +0100 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@felloff.net> | 2019-01-02 10:26:38 +0100 |
commit | c88ed6488f36eaa7d499dac424f647d166267dec (patch) | |
tree | a0a6320becf478d53804ab7792d020b138156f1a /sys/src/cmd/upas/fs | |
parent | de8580ed9f8fa2d34ae01f5b73bb14263322824a (diff) |
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.
Diffstat (limited to 'sys/src/cmd/upas/fs')
-rw-r--r-- | sys/src/cmd/upas/fs/cache.c | 18 | ||||
-rw-r--r-- | sys/src/cmd/upas/fs/dat.h | 2 | ||||
-rw-r--r-- | 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); |