diff options
author | Aaron Patterson <tenderlove@ruby-lang.org> | 2024-01-11 16:05:21 -0800 |
---|---|---|
committer | Aaron Patterson <aaron.patterson@gmail.com> | 2024-01-12 09:31:36 -0800 |
commit | 8b8dcc7af174def5216044019c1d3e42edfdc7cf (patch) | |
tree | 68d84a5ddd99991ecd349eabc193036f9b68888c /shape.c | |
parent | 2d9db72d37e570dcfc5e8b0b74476360cae96056 (diff) | |
download | ruby-8b8dcc7af174def5216044019c1d3e42edfdc7cf.tar.gz |
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
Diffstat (limited to 'shape.c')
-rw-r--r-- | shape.c | 8 |
1 files changed, 8 insertions, 0 deletions
@@ -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 |