Don't fail MPI_Alloc_mem() when no more memory can be registered.
This commit was SVN r15303.
Этот коммит содержится в:
родитель
11ff1b2c20
Коммит
88f4018543
@ -56,6 +56,25 @@ OBJ_CLASS_INSTANCE(
|
|||||||
mca_mpool_base_registration_constructor,
|
mca_mpool_base_registration_constructor,
|
||||||
mca_mpool_base_registration_destructor);
|
mca_mpool_base_registration_destructor);
|
||||||
|
|
||||||
|
static void unregister_tree_item(mca_mpool_base_tree_item_t *mpool_tree_item)
|
||||||
|
{
|
||||||
|
mca_mpool_base_module_t *mpool;
|
||||||
|
mca_mpool_base_registration_t *reg;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for(i = 1; i < mpool_tree_item->count; i++) {
|
||||||
|
mpool = mpool_tree_item->mpools[i];
|
||||||
|
reg = mpool_tree_item->regs[i];
|
||||||
|
if(mpool && mpool->mpool_deregister) {
|
||||||
|
mpool->mpool_deregister(mpool, reg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
mpool = mpool_tree_item->mpools[0];
|
||||||
|
reg = mpool_tree_item->regs[0];
|
||||||
|
mpool->mpool_free(mpool, mpool_tree_item->key, reg);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Function to allocate special memory according to what the user requests in
|
* Function to allocate special memory according to what the user requests in
|
||||||
* the info object.
|
* the info object.
|
||||||
@ -200,34 +219,44 @@ void *mca_mpool_base_alloc(size_t size, ompi_info_t *info)
|
|||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for(i = -1; i < reg_module_num; i++) {
|
||||||
if(NULL != no_reg_function)
|
if(-1 == i) {
|
||||||
{
|
if(NULL != no_reg_function)
|
||||||
mpool = no_reg_function->mpool_module;
|
mpool = no_reg_function->mpool_module;
|
||||||
i = 0;
|
else
|
||||||
} else {
|
continue;
|
||||||
mpool = has_reg_function[0]->mpool_module;
|
} else {
|
||||||
i = 1;
|
mpool = has_reg_function[i]->mpool_module;
|
||||||
}
|
|
||||||
mem = mpool->mpool_alloc(mpool, size, 0, MCA_MPOOL_FLAGS_PERSIST,
|
|
||||||
®istration);
|
|
||||||
if(NULL == mem)
|
|
||||||
goto out;
|
|
||||||
|
|
||||||
mpool_tree_item->key = mem;
|
|
||||||
mpool_tree_item->mpools[mpool_tree_item->count] = mpool;
|
|
||||||
mpool_tree_item->regs[mpool_tree_item->count++] = registration;
|
|
||||||
|
|
||||||
while(i < reg_module_num)
|
|
||||||
{
|
|
||||||
mpool = has_reg_function[i]->mpool_module;
|
|
||||||
if(mpool->mpool_register(mpool, mem, size, MCA_MPOOL_FLAGS_PERSIST,
|
|
||||||
®istration) != OMPI_SUCCESS) {
|
|
||||||
goto out;
|
|
||||||
}
|
}
|
||||||
mpool_tree_item->mpools[mpool_tree_item->count] = mpool;
|
|
||||||
mpool_tree_item->regs[mpool_tree_item->count++] = registration;
|
if(NULL == mem) {
|
||||||
i++;
|
mem = mpool->mpool_alloc(mpool, size, 0, MCA_MPOOL_FLAGS_PERSIST,
|
||||||
|
®istration);
|
||||||
|
if(NULL == mem) {
|
||||||
|
if(mpool_requested)
|
||||||
|
goto out;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
mpool_tree_item->key = mem;
|
||||||
|
mpool_tree_item->mpools[mpool_tree_item->count] = mpool;
|
||||||
|
mpool_tree_item->regs[mpool_tree_item->count++] = registration;
|
||||||
|
} else {
|
||||||
|
if(mpool->mpool_register(mpool, mem, size, MCA_MPOOL_FLAGS_PERSIST,
|
||||||
|
®istration) != OMPI_SUCCESS) {
|
||||||
|
if(mpool_requested) {
|
||||||
|
unregister_tree_item(mpool_tree_item);
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
mpool_tree_item->mpools[mpool_tree_item->count] = mpool;
|
||||||
|
mpool_tree_item->regs[mpool_tree_item->count++] = registration;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(NULL == mem) {
|
||||||
|
mem = malloc(size);
|
||||||
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
mca_mpool_base_tree_insert(mpool_tree_item);
|
mca_mpool_base_tree_insert(mpool_tree_item);
|
||||||
@ -253,9 +282,7 @@ out:
|
|||||||
int mca_mpool_base_free(void *base)
|
int mca_mpool_base_free(void *base)
|
||||||
{
|
{
|
||||||
mca_mpool_base_tree_item_t *mpool_tree_item = NULL;
|
mca_mpool_base_tree_item_t *mpool_tree_item = NULL;
|
||||||
mca_mpool_base_module_t *mpool;
|
int rc;
|
||||||
mca_mpool_base_registration_t *reg;
|
|
||||||
int i, rc;
|
|
||||||
|
|
||||||
if(!base) {
|
if(!base) {
|
||||||
return OMPI_ERROR;
|
return OMPI_ERROR;
|
||||||
@ -269,18 +296,7 @@ int mca_mpool_base_free(void *base)
|
|||||||
return OMPI_SUCCESS;
|
return OMPI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
for(i = 1; i < mpool_tree_item->count; i++) {
|
unregister_tree_item(mpool_tree_item);
|
||||||
mpool = mpool_tree_item->mpools[i];
|
|
||||||
reg = mpool_tree_item->regs[i];
|
|
||||||
if(mpool && mpool->mpool_deregister) {
|
|
||||||
mpool->mpool_deregister(mpool, reg);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
mpool = mpool_tree_item->mpools[0];
|
|
||||||
reg = mpool_tree_item->regs[0];
|
|
||||||
mpool->mpool_free(mpool, base, reg);
|
|
||||||
|
|
||||||
rc = mca_mpool_base_tree_delete(mpool_tree_item);
|
rc = mca_mpool_base_tree_delete(mpool_tree_item);
|
||||||
|
|
||||||
return rc;
|
return rc;
|
||||||
|
Загрузка…
x
Ссылка в новой задаче
Block a user