]> git.lizzy.rs Git - plan9front.git/commitdiff
upas/fs: don't put messages on the lru that cannot be uncached
authorcinap_lenrek <cinap_lenrek@felloff.net>
Wed, 2 Jan 2019 09:26:38 +0000 (10:26 +0100)
committercinap_lenrek <cinap_lenrek@felloff.net>
Wed, 2 Jan 2019 09:26:38 +0000 (10:26 +0100)
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
sys/src/cmd/upas/fs/dat.h
sys/src/cmd/upas/fs/mbox.c

index f7442e80c3bb872fe3b4c49af89c31056e92c154..5312886b3a25587fb3853a31542abd93c7893086 100644 (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);
        }
 }
 
index 67f11bb982496e24e540694a6662c5adde0c5c70..d25656b0c01060619e585b032a7c6143ad13624c 100644 (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);
index 044c4b09178b0b224e545ba394012376dd2cc85d..b83014ec00ff89094fee82256c9f70c0db79ebf2 100644 (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);