static void uct_iface_mp_obj_init(ucs_mpool_t *mp, void *obj, void *chunk) { uct_base_iface_t *iface = uct_iface_mp_priv(mp)->iface; uct_iface_mpool_init_obj_cb_t init_obj_cb; uct_iface_mp_chunk_hdr_t *hdr; init_obj_cb = uct_iface_mp_priv(mp)->init_obj_cb; hdr = chunk - sizeof(*hdr); if (init_obj_cb != NULL) { init_obj_cb(&iface->super, obj, hdr->memh); } }
static ucs_status_t uct_iface_mp_chunk_alloc(ucs_mpool_t *mp, size_t *size_p, void **chunk_p) { uct_base_iface_t *iface = uct_iface_mp_priv(mp)->iface; uct_iface_mp_chunk_hdr_t *hdr; uct_allocated_memory_t mem; ucs_status_t status; size_t length; length = sizeof(*hdr) + *size_p; status = uct_iface_mem_alloc(&iface->super, length, ucs_mpool_name(mp), &mem); if (status != UCS_OK) { return status; } ucs_assert(mem.memh != UCT_INVALID_MEM_HANDLE); ucs_assert(mem.md == iface->md); hdr = mem.address; hdr->method = mem.method; hdr->length = mem.length; hdr->memh = mem.memh; *size_p = mem.length - sizeof(*hdr); *chunk_p = hdr + 1; return UCS_OK; }
ucs_status_t uct_iface_mpool_init(uct_base_iface_t *iface, ucs_mpool_t *mp, size_t elem_size, size_t align_offset, size_t alignment, const uct_iface_mpool_config_t *config, unsigned grow, uct_iface_mpool_init_obj_cb_t init_obj_cb, const char *name) { unsigned elems_per_chunk; ucs_status_t status; elems_per_chunk = (config->bufs_grow != 0) ? config->bufs_grow : grow; status = ucs_mpool_init(mp, sizeof(uct_iface_mp_priv_t), elem_size, align_offset, alignment, elems_per_chunk, config->max_bufs, &uct_iface_mpool_ops, name); if (status != UCS_OK) { return status; } uct_iface_mp_priv(mp)->iface = iface; uct_iface_mp_priv(mp)->init_obj_cb = init_obj_cb; return UCS_OK; }
static void uct_iface_mp_chunk_release(ucs_mpool_t *mp, void *chunk) { uct_base_iface_t *iface = uct_iface_mp_priv(mp)->iface; uct_iface_mp_chunk_hdr_t *hdr; uct_allocated_memory_t mem; hdr = chunk - sizeof(*hdr); mem.address = hdr; mem.method = hdr->method; mem.memh = hdr->memh; mem.length = hdr->length; mem.md = iface->md; uct_iface_mem_free(&mem); }
(mem->memh != UCT_MEM_HANDLE_NULL)) { (void)uct_md_mem_dereg(mem->md, mem->memh); } uct_mem_free(mem); } static inline uct_iface_mp_priv_t* uct_iface_mp_priv(ucs_mpool_t *mp) { return (uct_iface_mp_priv_t*)ucs_mpool_priv(mp); } UCS_PROFILE_FUNC(ucs_status_t, uct_iface_mp_chunk_alloc, (mp, size_p, chunk_p), ucs_mpool_t *mp, size_t *size_p, void **chunk_p) { uct_base_iface_t *iface = uct_iface_mp_priv(mp)->iface; uct_iface_mp_chunk_hdr_t *hdr; uct_allocated_memory_t mem; ucs_status_t status; size_t length; length = sizeof(*hdr) + *size_p; status = uct_iface_mem_alloc(&iface->super, length, 0, ucs_mpool_name(mp), &mem); if (status != UCS_OK) { return status; } ucs_assert(mem.memh != UCT_MEM_HANDLE_NULL); ucs_assert(mem.md == iface->md);