diff --git a/src/datatype/datatype_internal.h b/src/datatype/datatype_internal.h index f21fa797af..ecd2ad56b0 100644 --- a/src/datatype/datatype_internal.h +++ b/src/datatype/datatype_internal.h @@ -371,6 +371,36 @@ int ompi_convertor_create_stack_at_begining( ompi_convertor_t* pConvertor, const pConvertor->bConverted = 0; return OMPI_SUCCESS; } + +static inline void +convertor_init_generic( ompi_convertor_t* pConv, const dt_desc_t* datatype, int count, + const void* pUserBuf ) +{ + uint32_t required_stack_length = datatype->btypes[DT_LOOP] + 3; + + OBJ_RETAIN( datatype ); + if( pConv->pDesc != datatype ) { + pConv->pDesc = (dt_desc_t*)datatype; + if( pConv->pStack != NULL ) { + if( pConv->stack_size > DT_STATIC_STACK_SIZE ) + free( pConv->pStack ); + } + pConv->pStack = pConv->static_stack; + pConv->stack_size = DT_STATIC_STACK_SIZE; + } + if( required_stack_length > pConv->stack_size ) { + assert( pConv->stack_size > DT_STATIC_STACK_SIZE ); + pConv->stack_size = required_stack_length; + pConv->pStack = (dt_stack_t*)malloc(sizeof(dt_stack_t) * pConv->stack_size ); + } + + pConv->pBaseBuf = (void*)pUserBuf; + pConv->available_space = count * (datatype->ub - datatype->lb); + pConv->count = count; + pConv->converted = 0; + pConv->bConverted = 0; +} + #if defined(c_plusplus) || defined(__cplusplus) } #endif diff --git a/src/datatype/dt_pack.c b/src/datatype/dt_pack.c index 3654a92b3f..a5e9d09449 100644 --- a/src/datatype/dt_pack.c +++ b/src/datatype/dt_pack.c @@ -756,35 +756,11 @@ int ompi_convertor_init_for_send( ompi_convertor_t* pConv, int starting_pos, memalloc_fct_t allocfn ) { + convertor_init_generic( pConv, datatype, count, pUserBuf ); - OBJ_RETAIN( datatype ); - if( pConv->pDesc != datatype ) { - pConv->pDesc = (dt_desc_t*)datatype; - if( pConv->pStack != NULL ) { - if( pConv->stack_size > DT_STATIC_STACK_SIZE ) - free( pConv->pStack ); - } - pConv->pStack = NULL; - } - - if( pConv->pStack == NULL ) { - pConv->stack_size = datatype->btypes[DT_LOOP] + 3; - if( pConv->stack_size > DT_STATIC_STACK_SIZE ) { - pConv->pStack = (dt_stack_t*)malloc(sizeof(dt_stack_t) * pConv->stack_size ); - } else { - pConv->pStack = pConv->static_stack; - } - pConv->stack_pos = 0; /* just to be sure */ - } - pConv->flags = CONVERTOR_SEND | CONVERTOR_HOMOGENEOUS; /* by default set to homogeneous */ - pConv->pBaseBuf = (void*)pUserBuf; - pConv->available_space = count * (datatype->ub - datatype->lb); - pConv->count = count; - pConv->pFunctions = ompi_ddt_copy_functions; - pConv->converted = 0; - pConv->bConverted = 0; - pConv->memAlloc_fn = allocfn; + pConv->pFunctions = ompi_ddt_copy_functions; + pConv->memAlloc_fn = allocfn; /* Just to avoid complaint from the compiler */ pConv->fAdvance = ompi_convertor_pack_general; pConv->fAdvance = ompi_convertor_pack_homogeneous_with_memcpy; diff --git a/src/datatype/dt_unpack.c b/src/datatype/dt_unpack.c index f7e18ce04f..dd7676ebe4 100644 --- a/src/datatype/dt_unpack.c +++ b/src/datatype/dt_unpack.c @@ -609,35 +609,12 @@ int ompi_convertor_init_for_recv( ompi_convertor_t* pConv, uint32_t flags, const void* pUserBuf, int starting_point, memalloc_fct_t allocfn ) { - OBJ_RETAIN( datatype ); - if( pConv->pDesc != datatype ) { - pConv->pDesc = (dt_desc_t*)datatype; - pConv->flags = CONVERTOR_RECV; - if( pConv->pStack != NULL ) { - if( pConv->stack_size > DT_STATIC_STACK_SIZE ) - free( pConv->pStack ); - } - pConv->pStack = NULL; - } - if( pConv->pStack == NULL ) { - pConv->stack_size = datatype->btypes[DT_LOOP] + 3; - if( pConv->stack_size > DT_STATIC_STACK_SIZE ) { - pConv->pStack = (dt_stack_t*)malloc(sizeof(dt_stack_t) * pConv->stack_size ); - } else { - pConv->pStack = pConv->static_stack; - } - pConv->stack_pos = 0; /* just to be sure */ - } + convertor_init_generic( pConv, datatype, count, pUserBuf ); pConv->flags = CONVERTOR_RECV | CONVERTOR_HOMOGENEOUS; - pConv->pBaseBuf = (void*)pUserBuf; - pConv->available_space = count * (datatype->ub - datatype->lb); - pConv->count = count; - pConv->pFunctions = ompi_ddt_copy_functions; - pConv->converted = 0; - pConv->bConverted = 0; - pConv->fAdvance = ompi_convertor_unpack_general; /* TODO: just stop complaining */ - pConv->fAdvance = ompi_convertor_unpack_homogeneous; /* default behaviour */ + pConv->pFunctions = ompi_ddt_copy_functions; + pConv->fAdvance = ompi_convertor_unpack_general; /* TODO: just stop complaining */ + pConv->fAdvance = ompi_convertor_unpack_homogeneous; /* default behaviour */ pConv->memAlloc_fn = allocfn; /* TODO: work only on homogeneous architectures */