From e7838e4b8676b0cebfc834612e2afa9fd53f6676 Mon Sep 17 00:00:00 2001 From: Marius Gerbershagen Date: Wed, 14 Feb 2018 20:41:58 +0100 Subject: [PATCH] threading: fix race conditions in CLOS cache Writes in the cache were not protected against interrupts, leading to segfaults when clear_list_from_cache or ecl_search_cache were interrupted. --- src/c/clos/cache.d | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/c/clos/cache.d b/src/c/clos/cache.d index 391c731fa..45fb79a37 100644 --- a/src/c/clos/cache.d +++ b/src/c/clos/cache.d @@ -56,6 +56,7 @@ clear_one_from_cache(ecl_cache_ptr cache, cl_object target) static void clear_list_from_cache(ecl_cache_ptr cache) { + ecl_disable_interrupts(); cl_object list = ecl_atomic_get(&cache->clear_list); cl_object table = cache->table; cl_index i, total_size = table->vector.dim; @@ -68,6 +69,7 @@ clear_list_from_cache(ecl_cache_ptr cache) } } } + ecl_enable_interrupts(); } #endif @@ -137,6 +139,7 @@ ecl_search_cache(ecl_cache_ptr cache) } #endif { + ecl_disable_interrupts(); cl_object table = cache->table; cl_object keys = cache->keys; cl_index argno = keys->vector.fillp; @@ -213,6 +216,7 @@ ecl_search_cache(ecl_cache_ptr cache) RECORD_GEN_SET(e, g); } } + ecl_enable_interrupts(); return (ecl_cache_record_ptr)min_e; } }