diff --git a/include/salloc.h b/include/salloc.h index 4c9e8773a457d5159711875ba79536428c6cc355..b8545dc717930d40fd3699324d28378670f9bba9 100644 --- a/include/salloc.h +++ b/include/salloc.h @@ -34,7 +34,7 @@ struct tbuf; bool salloc_init(size_t size, size_t minimal, double factor); void salloc_destroy(void); -void *salloc(size_t size); +void *salloc(size_t size, const char *what); void sfree(void *ptr); void slab_validate(); void slab_stat(struct tbuf *buf); diff --git a/mod/box/index.m b/mod/box/index.m index 9e8af16cb12979ebfbf0efe48f23d940422b142b..f71b3980707dae9f9270ea36012da7199dc09f6e 100644 --- a/mod/box/index.m +++ b/mod/box/index.m @@ -224,7 +224,7 @@ void hash_iterator_free(struct iterator *iterator) { assert(iterator->next == hash_iterator_next); - sfree(iterator); + free(iterator); } @@ -285,7 +285,7 @@ hash_iterator_free(struct iterator *iterator) - (struct iterator *) allocIterator { - struct hash_iterator *it = salloc(sizeof(struct hash_iterator)); + struct hash_iterator *it = malloc(sizeof(struct hash_iterator)); if (it) { memset(it, 0, sizeof(struct hash_iterator)); it->base.next = hash_iterator_next; diff --git a/mod/box/tree.m b/mod/box/tree.m index 73c35c974dba873447e8e5d178beeab5310d744e..b256bd31e2ba5589fcc86df0b117c2af1b3ec6b3 100644 --- a/mod/box/tree.m +++ b/mod/box/tree.m @@ -26,7 +26,6 @@ #include "tree.h" #include "box.h" #include "tuple.h" -#include <salloc.h> #include <pickle.h> /* {{{ Utilities. *************************************************/ @@ -801,7 +800,7 @@ tree_iterator_free(struct iterator *iterator) if (it->iter) sptree_index_iterator_free(it->iter); - sfree(it); + free(it); } /* }}} */ @@ -926,7 +925,7 @@ tree_iterator_free(struct iterator *iterator) - (struct iterator *) allocIterator { struct tree_iterator *it - = salloc(sizeof(struct tree_iterator) + SIZEOF_SPARSE_PARTS(key_def)); + = malloc(sizeof(struct tree_iterator) + SIZEOF_SPARSE_PARTS(key_def)); if (it) { memset(it, 0, sizeof(struct tree_iterator)); diff --git a/mod/box/tuple.m b/mod/box/tuple.m index c6af90b5b01fc73e75d9b772d930dcda62f44003..b7b5512267b13f1285110ed0cf6223d7d09da062 100644 --- a/mod/box/tuple.m +++ b/mod/box/tuple.m @@ -39,10 +39,7 @@ struct box_tuple * tuple_alloc(size_t size) { size_t total = sizeof(struct box_tuple) + size; - struct box_tuple *tuple = salloc(total); - - if (tuple == NULL) - tnt_raise(LoggedError, :ER_MEMORY_ISSUE, total, "slab allocator", "tuple"); + struct box_tuple *tuple = salloc(total, "tuple"); tuple->flags = tuple->refs = 0; tuple->bsize = size; diff --git a/src/salloc.m b/src/salloc.m index bb54a13ceb242d031100269962578dbf83c7b534..efe340ab113ba6c2b3104d206bc45fcd237f411f 100644 --- a/src/salloc.m +++ b/src/salloc.m @@ -38,6 +38,7 @@ #include <util.h> #include <tbuf.h> #include <say.h> +#include "exception.h" #define SLAB_ALIGN_PTR(ptr) (void *)((uintptr_t)(ptr) & ~(SLAB_SIZE - 1)) @@ -258,17 +259,18 @@ valid_item(struct slab *slab, void *item) #endif void * -salloc(size_t size) +salloc(size_t size, const char *what) { struct slab_class *class; struct slab *slab; struct slab_item *item; - if ((class = class_for(size)) == NULL) - return NULL; + if ((class = class_for(size)) == NULL || + (slab = slab_of(class)) == NULL) { - if ((slab = slab_of(class)) == NULL) - return NULL; + tnt_raise(LoggedError, :ER_MEMORY_ISSUE, size, + "slab allocator", what); + } if (slab->free == NULL) { assert(valid_item(slab, slab->brk));