/** * Copyright (C) Mellanox Technologies Ltd. 2001-2015. ALL RIGHTS RESERVED. * * See file LICENSE for terms. */ #ifndef UCS_MPOOL_INL_ #define UCS_MPOOL_INL_ #include "mpool.h" #include #include #include static inline void *ucs_mpool_get_inline(ucs_mpool_t *mp) { ucs_mpool_elem_t *elem; void *obj; if (ucs_unlikely(mp->freelist == NULL)) { return ucs_mpool_get_grow(mp); } /* Disconnect an element from the pool */ elem = mp->freelist; VALGRIND_MAKE_MEM_DEFINED(elem, sizeof *elem); mp->freelist = elem->next; elem->mpool = mp; VALGRIND_MAKE_MEM_NOACCESS(elem, sizeof *elem); obj = elem + 1; VALGRIND_MEMPOOL_ALLOC(mp, obj, mp->data->elem_size - sizeof(ucs_mpool_elem_t)); return obj; } static inline void ucs_mpool_add_to_freelist(ucs_mpool_t *mp, ucs_mpool_elem_t *elem, int add_to_tail) { ucs_mpool_elem_t *tail; if (add_to_tail) { elem->next = NULL; if (mp->freelist == NULL) { mp->freelist = elem; } else { tail = mp->data->tail; VALGRIND_MAKE_MEM_DEFINED(tail, sizeof *tail); tail->next = elem; VALGRIND_MAKE_MEM_NOACCESS(tail, sizeof *tail); } mp->data->tail = elem; } else { elem->next = mp->freelist; mp->freelist = elem; } } static inline ucs_mpool_elem_t *ucs_mpool_obj_to_elem(void *obj) { ucs_mpool_elem_t *elem = (ucs_mpool_elem_t*)obj - 1; VALGRIND_MAKE_MEM_DEFINED(elem, sizeof *elem); return elem; } static inline ucs_mpool_t *ucs_mpool_obj_owner(void *obj) { return ucs_mpool_obj_to_elem(obj)->mpool; } static inline void ucs_mpool_put_inline(void *obj) { ucs_mpool_elem_t *elem; ucs_mpool_t *mp; elem = ucs_mpool_obj_to_elem(obj); mp = elem->mpool; ucs_mpool_add_to_freelist(mp, elem, ENABLE_DEBUG_DATA && ucs_global_opts.mpool_fifo); VALGRIND_MAKE_MEM_NOACCESS(elem, sizeof *elem); VALGRIND_MEMPOOL_FREE(mp, obj); } #endif