2007-12-21 09:02:00 +03:00
/* -*- Mode: C; c-basic-offset:4 ; -*- */
2005-09-14 17:27:09 +04:00
/*
2005-11-05 22:57:48 +03:00
* Copyright ( c ) 2004 - 2005 The Trustees of Indiana University and Indiana
* University Research and Technology
* Corporation . All rights reserved .
2007-12-21 09:02:00 +03:00
* Copyright ( c ) 2004 - 2007 The University of Tennessee and The University
2005-11-05 22:57:48 +03:00
* of Tennessee Research Foundation . All rights
* reserved .
2005-09-14 17:27:09 +04:00
* Copyright ( c ) 2004 - 2005 High Performance Computing Center Stuttgart ,
* University of Stuttgart . All rights reserved .
* Copyright ( c ) 2004 - 2005 The Regents of the University of California .
* All rights reserved .
2009-04-14 03:41:45 +04:00
* Copyright ( c ) 2009 Cisco Systems , Inc . All rights reserved .
2005-09-14 17:27:09 +04:00
* $ COPYRIGHT $
*
* Additional copyrights may follow
*
* $ HEADER $
*/
/**
* @ file
*/
2006-08-24 20:38:08 +04:00
# include "ompi_config.h"
2009-03-17 23:21:36 +03:00
2009-04-14 17:39:06 +04:00
# ifdef HAVE_UNISTD_H
2009-04-14 04:54:20 +04:00
# include <unistd.h>
2009-04-14 17:39:06 +04:00
# endif
2009-04-14 04:54:20 +04:00
# include "orte/util/show_help.h"
# include "orte/util/proc_info.h"
# include "ompi/mca/mpool/base/mpool_base_mem_cb.h"
# include "ompi/mca/mpool/base/base.h"
# include "ompi/runtime/mpiruntime.h"
static char msg [ 512 ] ;
2005-09-14 17:27:09 +04:00
2005-09-27 06:01:21 +04:00
2005-09-14 17:27:09 +04:00
/*
2009-04-14 04:54:20 +04:00
* memory hook callback , called when memory is free ' d out from under
* us . Be wary of the from_alloc flag - - if you ' re called with
* from_alloc = = true , then you cannot call malloc ( or any of its
* friends ) !
2005-09-14 17:27:09 +04:00
*/
2005-12-16 04:12:45 +03:00
void mca_mpool_base_mem_cb ( void * base , size_t size , void * cbdata ,
bool from_alloc )
2005-09-22 20:18:23 +04:00
{
2005-09-14 17:27:09 +04:00
mca_mpool_base_selected_module_t * current ;
int rc ;
opal_list_item_t * item ;
2009-04-14 04:54:20 +04:00
/* Only do anything meaningful if we're between MPI_INIT and
MPI_FINALIZE , and size ! = 0 */
if ( ( from_alloc & & ( ! ompi_mpi_initialized | | ompi_mpi_finalized ) ) | |
size = = 0 ) {
2005-09-27 22:10:44 +04:00
return ;
}
2005-09-14 17:27:09 +04:00
for ( item = opal_list_get_first ( & mca_mpool_base_modules ) ;
item ! = opal_list_get_end ( & mca_mpool_base_modules ) ;
item = opal_list_get_next ( item ) ) {
current = ( mca_mpool_base_selected_module_t * ) item ;
2006-12-17 15:26:41 +03:00
if ( current - > mpool_module - > mpool_release_memory ! = NULL ) {
rc = current - > mpool_module - > mpool_release_memory ( current - > mpool_module ,
base , size ) ;
2009-04-14 04:54:20 +04:00
if ( rc ! = OMPI_SUCCESS ) {
if ( from_alloc ) {
int len ;
len = snprintf ( msg , sizeof ( msg ) , " [%s:%d] Attempt to free memory that is still in use by an ongoing MPI communication (buffer %p, size %lu). MPI job will now abort. \n " ,
orte_process_info . nodename ,
getpid ( ) ,
base , ( unsigned long ) size ) ;
msg [ sizeof ( msg ) - 1 ] = ' \0 ' ;
write ( 2 , msg , len ) ;
} else {
orte_show_help ( " help-mpool-base.txt " ,
" cannot deregister in-use memory " , true ,
current - > mpool_component - > mpool_version . mca_component_name ,
orte_process_info . nodename ,
base , ( unsigned long ) size ) ;
}
/* We're in a callback from somewhere; we can't do
anything meaningful to pass an error back up . : - (
So just exit . Call _exit ( ) so that we don ' t try to
call anything on the way out - - just exit !
( remember that we ' re in a callback , and state may
be very undefined at this point . . . ) */
_exit ( 1 ) ;
2005-09-14 17:27:09 +04:00
}
2005-09-27 06:01:21 +04:00
}
2005-10-04 03:29:26 +04:00
}
2005-09-14 17:27:09 +04:00
}