1
1

Don't fail MPI_Alloc_mem() when no more memory can be registered.

This commit was SVN r15303.
Этот коммит содержится в:
Gleb Natapov 2007-07-08 11:44:58 +00:00
родитель 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,
&registration);
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,
&registration) != 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,
&registration);
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,
&registration) != 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;