aboutsummaryrefslogtreecommitdiff
path: root/src/dicache.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/dicache.c')
-rw-r--r--src/dicache.c10
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);