diff --git a/opal/mca/mpool/base/Makefile.am b/opal/mca/mpool/base/Makefile.am index 646444e231d..dd85a97fb6b 100644 --- a/opal/mca/mpool/base/Makefile.am +++ b/opal/mca/mpool/base/Makefile.am @@ -28,7 +28,8 @@ libmca_mpool_la_SOURCES += \ base/mpool_base_lookup.c \ base/mpool_base_alloc.c \ base/mpool_base_tree.c \ - base/mpool_base_default.c + base/mpool_base_default.c \ + base/mpool_base_basic.c dist_opaldata_DATA += \ base/help-mpool-base.txt diff --git a/opal/mca/mpool/base/base.h b/opal/mca/mpool/base/base.h index 88a99cad01a..6d95665bff7 100644 --- a/opal/mca/mpool/base/base.h +++ b/opal/mca/mpool/base/base.h @@ -53,6 +53,8 @@ OPAL_DECLSPEC OBJ_CLASS_DECLARATION(mca_mpool_base_selected_module_t); OPAL_DECLSPEC mca_mpool_base_component_t* mca_mpool_base_component_lookup(const char* name); OPAL_DECLSPEC mca_mpool_base_module_t* mca_mpool_base_module_lookup(const char* name); +OPAL_DECLSPEC mca_mpool_base_module_t *mca_mpool_basic_create (void *base, size_t size, unsigned min_align); + /* * Globals */ diff --git a/opal/mca/mpool/base/mpool_base_basic.c b/opal/mca/mpool/base/mpool_base_basic.c new file mode 100644 index 00000000000..fba7e6fed7b --- /dev/null +++ b/opal/mca/mpool/base/mpool_base_basic.c @@ -0,0 +1,109 @@ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil -*- */ +/* + * Copyright (c) 2015 Los Alamos National Security, LLC. All rights + * reserved. + * Copyright (c) 2016 Intel, Inc. All rights reserved. + * Copyrigth (c) 2018 Triad National Security, LLC. All rights + * reserved. + * $COPYRIGHT$ + * + * Additional copyrights may follow + * + * $HEADER$ + */ + +#include "opal_config.h" +#include "opal/align.h" + +#include +#include +#ifdef HAVE_UNISTD_H +#include +#endif /* HAVE_UNISTD_H */ + +#include "opal/mca/mca.h" +#include "opal/mca/base/base.h" +#include "opal/mca/mpool/base/base.h" +#include "opal/constants.h" +#include "opal/util/sys_limits.h" + +struct mca_mpool_base_basic_module_t { + mca_mpool_base_module_t super; + opal_mutex_t lock; + uintptr_t ptr; + size_t size; + size_t avail; + unsigned min_align; +}; +typedef struct mca_mpool_base_basic_module_t mca_mpool_base_basic_module_t; + +static void *mca_mpool_base_basic_alloc (mca_mpool_base_module_t *mpool, size_t size, + size_t align, uint32_t flags) +{ + mca_mpool_base_basic_module_t *basic_module = (mca_mpool_base_basic_module_t *) mpool; + uintptr_t next_ptr; + void *ptr; + + opal_mutex_lock (&basic_module->lock); + + align = align > basic_module->min_align ? align : basic_module->min_align; + + next_ptr = OPAL_ALIGN(basic_module->ptr, align, uintptr_t); + + size = OPAL_ALIGN(size, 8, size_t) + next_ptr - basic_module->ptr; + + if (size > basic_module->avail) { + opal_mutex_unlock (&basic_module->lock); + return NULL; + } + + ptr = (void *) next_ptr; + basic_module->avail -= size; + basic_module->ptr += size; + + opal_mutex_unlock (&basic_module->lock); + return ptr; +} + +/** + * free function + */ +static void mca_mpool_base_basic_free (mca_mpool_base_module_t *mpool, void *addr) +{ + /* nothing to do for now */ +} + +static void mca_mpool_base_basic_finalize (struct mca_mpool_base_module_t *mpool) +{ + mca_mpool_base_basic_module_t *basic_module = (mca_mpool_base_basic_module_t *) mpool; + + OBJ_DESTRUCT(&basic_module->lock); + free (mpool); +} + +static mca_mpool_base_module_t mca_mpool_basic_template = { + .mpool_alloc = mca_mpool_base_basic_alloc, + .mpool_free = mca_mpool_base_basic_free, + .mpool_finalize = mca_mpool_base_basic_finalize, + .flags = MCA_MPOOL_FLAGS_MPI_ALLOC_MEM, +}; + +mca_mpool_base_module_t *mca_mpool_basic_create (void *base, size_t size, unsigned min_align) +{ + mca_mpool_base_basic_module_t *basic_module = calloc (1, sizeof (*basic_module)); + + if (OPAL_UNLIKELY(NULL == basic_module)) { + return NULL; + } + + memcpy (&basic_module->super, &mca_mpool_basic_template, sizeof (mca_mpool_basic_template)); + + OBJ_CONSTRUCT(&basic_module->lock, opal_mutex_t); + + basic_module->super.mpool_base = base; + basic_module->ptr = (uintptr_t) base; + basic_module->size = basic_module->avail = size; + basic_module->min_align = min_align; + + return &basic_module->super; +}