diff options
Diffstat (limited to 'src/dicache.c')
-rw-r--r-- | src/dicache.c | 8 |
1 files changed, 5 insertions, 3 deletions
diff --git a/src/dicache.c b/src/dicache.c index c8cf7471..975b6a10 100644 --- a/src/dicache.c +++ b/src/dicache.c @@ -388,10 +388,12 @@ void a_Dicache_callback(int Op, CacheClient_t *Client) Client->Version = DicEntry->version; /* Only call the decoder when necessary */ + int newData = FALSE; if (Op == CA_Send && DicEntry->State < DIC_Close && DicEntry->DecodedSize < Client->BufSize) { DicEntry->Decoder(Op, Client); DicEntry->DecodedSize = Client->BufSize; + newData = TRUE; } else if (Op == CA_Close || Op == CA_Abort) { if (DicEntry->State < DIC_Close) { DicEntry->Decoder(Op, Client); @@ -409,7 +411,7 @@ void a_Dicache_callback(int Op, CacheClient_t *Client) DicEntry->version, DicEntry->width, DicEntry->height, DicEntry->type); } - if (DicEntry->State == DIC_Write) { + if (DicEntry->State == DIC_Write && newData) { if (DicEntry->ScanNumber == Image->ScanNumber) { for (i = 0; i < DicEntry->height; ++i) if (a_Bitvec_get_bit(DicEntry->BitVec, (int)i) && @@ -450,8 +452,8 @@ void a_Dicache_cleanup(void) node = dList_nth_data(CachedIMGs, i); /* iterate each entry of this node */ for (entry = node->first; entry; entry = entry->next) { - if (entry->v_imgbuf && - a_Imgbuf_last_reference(entry->v_imgbuf)) { + if (entry->RefCount == 1 || + (entry->v_imgbuf && a_Imgbuf_last_reference(entry->v_imgbuf))) { /* free this unused entry */ if (entry->next) { Dicache_remove(node->url, entry->version); |