diff options
Diffstat (limited to 'src/dicache.c')
-rw-r--r-- | src/dicache.c | 10 |
1 files changed, 6 insertions, 4 deletions
diff --git a/src/dicache.c b/src/dicache.c index 88a35daf..1c546e98 100644 --- a/src/dicache.c +++ b/src/dicache.c @@ -356,7 +356,7 @@ void a_Dicache_close(DilloUrl *url, int version, CacheClient_t *Client) dReturn_if_fail ( DicEntry != NULL ); - /* print msg before actual unref to avoid dereferencing an invalid pointer */ + /* a_Dicache_unref() may free DicEntry */ MSG("a_Dicache_close RefCount=%d\n", DicEntry->RefCount - 1); if (DicEntry->State < DIC_Close) { @@ -390,10 +390,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); @@ -411,7 +413,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) && @@ -452,8 +454,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); |