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.
This commit is contained in:
cinap_lenrek 2019-01-02 10:26:38 +01:00
parent de8580ed9f
commit c88ed6488f
3 changed files with 12 additions and 10 deletions

View file

@ -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);
}
}

View file

@ -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);

View file

@ -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);