diff --git a/src/lib/small/slab_arena.c b/src/lib/small/slab_arena.c index 8d108f629ac2af40a01157a72981aa78e50b28f1..0fb4939693ca173f484920594d4ede42a2490198 100644 --- a/src/lib/small/slab_arena.c +++ b/src/lib/small/slab_arena.c @@ -42,12 +42,13 @@ #define MAP_ANONYMOUS MAP_ANON #endif -void +static void munmap_checked(void *addr, size_t size) { if (munmap(addr, size)) { char buf[64]; - intptr_t ignore_it = (intptr_t)strerror_r(errno, buf, sizeof(buf)); + intptr_t ignore_it = (intptr_t)strerror_r(errno, buf, + sizeof(buf)); (void)ignore_it; fprintf(stderr, "Error in munmap(%p, %zu): %s\n", addr, size, buf); @@ -76,7 +77,7 @@ mmap_checked(size_t size, size_t align, int flags) munmap_checked(map, size); /* - * mmap twice the requested amount to be able to align + * mmap enough amount to be able to align * the mapped address. This can lead to virtual memory * fragmentation depending on the kernels allocation * strategy. @@ -187,8 +188,13 @@ slab_map(struct slab_arena *arena) if (used <= arena->prealloc) return arena->arena + used - arena->slab_size; - return mmap_checked(arena->slab_size, arena->slab_size, - arena->flags); + ptr = mmap_checked(arena->slab_size, arena->slab_size, + arena->flags); + if (!ptr) { + __sync_sub_and_fetch(&arena->used, arena->slab_size); + quota_release(arena->quota, arena->slab_size); + } + return ptr; } void diff --git a/src/lib/small/slab_arena.h b/src/lib/small/slab_arena.h index 308fa26b89784c6709e17b64b49eff61edacb520..86c7bd107e89e90a03c3244e70fa68a11cb4c3fa 100644 --- a/src/lib/small/slab_arena.h +++ b/src/lib/small/slab_arena.h @@ -68,9 +68,8 @@ struct slab_arena { */ size_t prealloc; /** - * How much memory in the preallocated arena has + * How much memory in the arena has * already been initialized for slabs. - * @invariant used <= prealloc. */ size_t used; /** diff --git a/src/lib/small/slab_cache.c b/src/lib/small/slab_cache.c index aad3a3412f320870c4f9729ffaa5d6247142d641..44a79f3358dcf48077b257b8dd64bd3a26e6c9fb 100644 --- a/src/lib/small/slab_cache.c +++ b/src/lib/small/slab_cache.c @@ -109,9 +109,12 @@ slab_is_free(struct slab *slab) static inline void slab_poison(struct slab *slab) { - static const char poison_char = 'P'; + (void)slab; +#ifndef NDEBUG + const char poison_char = 'P'; memset((char *) slab + slab_sizeof(), poison_char, slab->size - slab_sizeof()); +#endif } static inline void diff --git a/src/memory.cc b/src/memory.cc index 81265a28c9c47b1dcbb78276c6aab37eeb01b31d..1c4e55093a1c6922fbb7bc2b02d9e2f3031f6aae 100644 --- a/src/memory.cc +++ b/src/memory.cc @@ -37,7 +37,7 @@ void memory_init() { static struct quota runtime_quota; - static const size_t SLAB_SIZE = 4 * 1024 * 1024; + const size_t SLAB_SIZE = 4 * 1024 * 1024; /* default quota initialization */ quota_init(&runtime_quota, QUOTA_MAX);