URI: 
       tsilly cache hack, also fix vtfilewritebefore not to be so aggressive. - plan9port - [fork] Plan 9 from user space
  HTML git clone git://src.adamsgaard.dk/plan9port
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
   DIR commit a1882dc1d0eeb8eb15614b28d3c11a3697bcd185
   DIR parent 7cb748941ecffdd66630ba463080cf44fcb62161
  HTML Author: rsc <devnull@localhost>
       Date:   Thu, 17 Jun 2004 19:17:04 +0000
       
       silly cache hack, also fix vtfilewritebefore not to be so aggressive.
       
       Diffstat:
         M src/libventi/cache.c                |      20 ++++++++++++++++++--
         M src/libventi/file.c                 |      11 +++++++----
       
       2 files changed, 25 insertions(+), 6 deletions(-)
       ---
   DIR diff --git a/src/libventi/cache.c b/src/libventi/cache.c
       t@@ -39,6 +39,7 @@ struct VtCache
                int                nblock;
                uchar        *mem;        /* memory for all blocks and data */
                int                mode;
       +        int                (*write)(VtConn*, uchar[VtScoreSize], uint, uchar*, int);
        };
        
        static void cachecheck(VtCache*);
       t@@ -56,13 +57,13 @@ vtcachealloc(VtConn *z, int blocksize, ulong nblock, int mode)
                c->z = z;
                c->blocksize = (blocksize + 127) & ~127;
                c->nblock = nblock;
       -
                c->nhash = nblock;
                c->hash = vtmallocz(nblock*sizeof(VtBlock*));
                c->heap = vtmallocz(nblock*sizeof(VtBlock*));
                c->block = vtmallocz(nblock*sizeof(VtBlock));
                c->mem = vtmallocz(nblock*c->blocksize);
                c->mode = mode;
       +        c->write = vtwrite;
        
                p = c->mem;
                for(i=0; i<nblock; i++){
       t@@ -79,6 +80,19 @@ vtcachealloc(VtConn *z, int blocksize, ulong nblock, int mode)
                return c;
        }
        
       +/*
       + * BUG This is here so that vbackup can override it and do some
       + * pipelining of writes.  Arguably vtwrite or vtwritepacket or the
       + * cache itself should be providing this functionality.
       + */
       +void
       +vtcachesetwrite(VtCache *c, int (*write)(VtConn*, uchar[VtScoreSize], uint, uchar*, int))
       +{
       +        if(write == nil)
       +                write = vtwrite;
       +        c->write = write;
       +}
       +
        void
        vtcachefree(VtCache *c)
        {
       t@@ -405,6 +419,8 @@ vtcacheglobal(VtCache *c, uchar score[VtScoreSize], int type)
        
                n = vtread(c->z, score, type, b->data, c->blocksize);
                if(n < 0){
       +                werrstr("vtread %V: %r", score);
       +abort();
                        b->iostate = BioVentiError;
                        vtblockput(b);
                        return nil;
       t@@ -494,7 +510,7 @@ vtblockwrite(VtBlock *b)
        
                c = b->c;
                n = vtzerotruncate(b->type, b->data, c->blocksize);
       -        if(vtwrite(c->z, score, b->type, b->data, n) < 0)
       +        if(c->write(c->z, score, b->type, b->data, n) < 0)
                        return -1;
        
                memmove(b->score, score, VtScoreSize);
   DIR diff --git a/src/libventi/file.c b/src/libventi/file.c
       t@@ -1222,10 +1222,13 @@ vtfileflushbefore(VtFile *r, u64int offset)
                                 * if the rest of the block is already flushed,
                                 * we can flush the whole block.
                                 */
       -                        ok = 1;
       -                        for(; j<ppb; j++)
       -                                if(vtglobaltolocal(b->data+j*VtScoreSize) != NilBlock)
       -                                        ok = 0;
       +                        ok = 0;
       +                        if(index[i] != index1[i]){
       +                                ok = 1;
       +                                for(; j<ppb; j++)
       +                                        if(vtglobaltolocal(b->data+j*VtScoreSize) != NilBlock)
       +                                                ok = 0;
       +                        }
                        }
                        if(ok){
                                if(i == depth)