diff --git a/src/cache/ftccache.c b/src/cache/ftccache.c index 28f3f3e7a..4272e0090 100644 --- a/src/cache/ftccache.c +++ b/src/cache/ftccache.c @@ -568,9 +568,13 @@ manager->cur_weight -= cache->clazz.node_weight( node, cache ); ftc_node_mru_unlink( node, manager ); - cache->clazz.node_free( node, cache ); - - cache->slack++; + if ( node->ref_count <= 0 ) + { + cache->clazz.node_free( node, cache ); + cache->slack++; + } + else + node->link = node; /* mark unlinked */ } else pnode = &node->link; diff --git a/src/cache/ftcmanag.c b/src/cache/ftcmanag.c index 4c1d85ab1..200c3fe31 100644 --- a/src/cache/ftcmanag.c +++ b/src/cache/ftcmanag.c @@ -667,10 +667,22 @@ FTC_Node_Unref( FTC_Node node, FTC_Manager manager ) { - if ( node && - manager && - node->cache_index < manager->num_caches ) - node->ref_count--; + if ( !node || !manager || + node->cache_index >= manager->num_caches ) + return; + + node->ref_count--; + + /* free unlinked node */ + if ( node->ref_count <= 0 && node->link == node ) + { + FTC_Cache cache = manager->caches[node->cache_index]; + + + cache->clazz.node_free( node, cache ); + cache->slack++; + ftc_cache_resize( cache ); + } }