Hello, my main object was the object caching facility for pure performance reason. And as I wrote I don't even test it. All the debug and align features was out of my mind. Only to get the object caching feature from libumem is a little bloaty, I must admit. But maybe there is a realy performance boost noticeable. Than it would be better to include a object cache into OMPIs own memory subsystem. But something showed up by including this second memory subsystem: I found 2 piece of code that use just a free() to release an object created with OBJ_NEW(), this wouldn't show up without using libumem (or any other memory system other than that of OMPI). And a second case where the situation is the other way around. I have attached a diff to show the 3 places. And lastly the chaining of all classes is not practical when using dynamic object loading (mca components). Because the objects are unloaded befor the class system is shutdown.
Bert
--- ompi/mca/btl/base/btl_base_close.c | 2 +- opal/mca/base/mca_base_components_close.c | 2 +- opal/util/if.c | 5 ++++- 3 files changed, 6 insertions(+), 3 deletions(-) diff --quilt old/opal/mca/base/mca_base_components_close.c new/opal/mca/base/mca_base_components_close.c --- old/opal/mca/base/mca_base_components_close.c +++ new/opal/mca/base/mca_base_components_close.c @@ -60,11 +60,11 @@ int mca_base_components_close(int output opal_output_verbose(10, output_id, "mca: base: close: unloading component %s", component->mca_component_name); mca_base_component_repository_release((mca_base_component_t *) component); - free(pcli); + OBJ_RELEASE(pcli); } else { skipped_pcli = pcli; } } diff --quilt old/ompi/mca/btl/base/btl_base_close.c new/ompi/mca/btl/base/btl_base_close.c --- old/ompi/mca/btl/base/btl_base_close.c +++ new/ompi/mca/btl/base/btl_base_close.c @@ -48,11 +48,11 @@ int mca_btl_base_close(void) /* Blatebtly ignore the return code (what would we do to recover, anyway? This component is going away, so errors don't matter anymore) */ sm->btl_module->btl_finalize(sm->btl_module); - free(sm); + OBJ_RELEASE(sm); } /* Close all remaining opened components (may be one if this is a OMPI RTE program, or [possibly] multiple if this is ompi_info) */ diff --quilt old/opal/util/if.c new/opal/util/if.c --- old/opal/util/if.c +++ new/opal/util/if.c @@ -298,10 +298,11 @@ static int opal_ifinit(void) if(intf_ptr == 0) { opal_output(0, "opal_ifinit: unable to allocated %lu bytes\n", (unsigned long)sizeof(opal_if_t)); return OPAL_ERR_OUT_OF_RESOURCE; } memcpy(intf_ptr, &intf, sizeof(intf)); + OBJ_DESTRUCT(&intf); opal_list_append(&opal_if_list, (opal_list_item_t*)intf_ptr); } free(ifconf.ifc_req); close(sd); @@ -396,10 +397,11 @@ static int opal_ifinit(void) opal_output (0,"opal_ifinit: Unable to malloc %d bytes",sizeof(opal_list_t)); return OPAL_ERR_OUT_OF_RESOURCE; } memcpy (intf_ptr, &intf, sizeof(intf)); + OBJ_DESTRUCT(&intf); opal_list_append(&opal_if_list, (opal_list_item_t *)intf_ptr); } } #endif @@ -417,11 +419,12 @@ int opal_iffinalize(void) #ifndef __WINDOWS__ opal_if_t *intf_ptr; while (NULL != (intf_ptr = (opal_if_t*)opal_list_remove_first(&opal_if_list))) { - OBJ_RELEASE(intf_ptr); + /* The elements in this list are self malloc()ed */ + free(intf_ptr); } OBJ_DESTRUCT(&opal_if_list); #endif already_done = false; }