From 9a2aa913c1dd0c23d0e28d2dfa72df9a409b6cd1 Mon Sep 17 00:00:00 2001 From: Alexei Podtelezhnikov Date: Sat, 14 Mar 2026 10:18:35 -0400 Subject: [PATCH] [cache] Protect referenced nodes. Delay freeing of referenced noted after FT_Manager_RemoveFaceID. Fixes #1401. * src/cache/ftcmanag.c (FTC_Cache_RemoveFaceID): Mark referenced nodes for later removal. * src/cache/ftcmanag.c (FTC_Node_Unref): Free unlinked modes. --- src/cache/ftccache.c | 10 +++++++--- src/cache/ftcmanag.c | 20 ++++++++++++++++---- 2 files changed, 23 insertions(+), 7 deletions(-) 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 ); + } }