From 8b8dcc7af174def5216044019c1d3e42edfdc7cf Mon Sep 17 00:00:00 2001 From: Aaron Patterson Date: Thu, 11 Jan 2024 16:05:21 -0800 Subject: [PATCH] Handle mmap failures for redblack tree cache The redblack tree cache is totally optional, so if we can't allocate room for the cache, then just pretend as if the cache is full if mmap fails --- shape.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/shape.c b/shape.c index 4cd4acd7f9..8d8314db33 100644 --- a/shape.c +++ b/shape.c @@ -1233,6 +1233,14 @@ Init_default_shapes(void) rb_shape_tree_ptr->shape_cache = (redblack_node_t *)mmap(NULL, rb_size_mul_or_raise(REDBLACK_CACHE_SIZE, sizeof(redblack_node_t), rb_eRuntimeError), PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); rb_shape_tree_ptr->cache_size = 0; + + // If mmap fails, then give up on the redblack tree cache. + // We set the cache size such that the redblack node allocators think + // the cache is full. + if (GET_SHAPE_TREE()->shape_cache == MAP_FAILED) { + GET_SHAPE_TREE()->shape_cache = 0; + GET_SHAPE_TREE()->cache_size = REDBLACK_CACHE_SIZE; + } #endif // Shapes by size pool