From f11ec2560a1ef90d1f4a034525a0eb5e18c0a3b0 Mon Sep 17 00:00:00 2001 From: George Bosilca Date: Thu, 9 Jun 2005 22:25:31 +0000 Subject: [PATCH] The user provided memory allocation function take one more argument a void*. This can be set by the caller via the ompi_convertor_personalize call. This commit was SVN r6021. --- src/datatype/convertor.c | 15 +++++++++------ src/datatype/convertor.h | 6 ++++-- src/datatype/dt_pack.c | 15 ++++++++++----- src/datatype/dt_sndrcv.c | 2 +- 4 files changed, 24 insertions(+), 14 deletions(-) diff --git a/src/datatype/convertor.c b/src/datatype/convertor.c index da6f35fa07..1e8776b41a 100644 --- a/src/datatype/convertor.c +++ b/src/datatype/convertor.c @@ -49,11 +49,12 @@ inline int ompi_convertor_cleanup( ompi_convertor_t* convertor ) static void ompi_convertor_construct( ompi_convertor_t* convertor ) { - convertor->pDesc = NULL; - convertor->pStack = convertor->static_stack; - convertor->stack_size = DT_STATIC_STACK_SIZE; - convertor->fAdvance = NULL; - convertor->memAlloc_fn = NULL; + convertor->pDesc = NULL; + convertor->pStack = convertor->static_stack; + convertor->stack_size = DT_STATIC_STACK_SIZE; + convertor->fAdvance = NULL; + convertor->memAlloc_fn = NULL; + convertor->memAlloc_userdata = NULL; } static void ompi_convertor_destruct( ompi_convertor_t* convertor ) @@ -212,10 +213,12 @@ inline int32_t ompi_convertor_set_position( ompi_convertor_t* convertor, size_t* int32_t ompi_convertor_personalize( ompi_convertor_t* convertor, uint32_t flags, - size_t* position, memalloc_fct_t allocfn ) + size_t* position, memalloc_fct_t allocfn, void* userdata ) { convertor->flags |= flags; convertor->memAlloc_fn = allocfn; + convertor->memAlloc_userdata = userdata; + return ompi_convertor_set_position( convertor, position ); } diff --git a/src/datatype/convertor.h b/src/datatype/convertor.h index e5f365a69f..0abdb14e78 100644 --- a/src/datatype/convertor.h +++ b/src/datatype/convertor.h @@ -54,7 +54,7 @@ typedef int32_t (*convertor_advance_fct_t)( ompi_convertor_t* pConvertor, uint32_t* inputCount, size_t* max_data, int32_t* freeAfter ); -typedef void*(*memalloc_fct_t)( size_t* pLength ); +typedef void*(*memalloc_fct_t)( size_t* pLengthi, void* userdata ); typedef struct dt_stack { int16_t index; /**< index in the element description */ @@ -78,6 +78,7 @@ struct ompi_convertor_t { uint32_t stack_size; /**< size of the allocated stack */ convertor_advance_fct_t fAdvance; /**< pointer to the pack/unpack functions */ memalloc_fct_t memAlloc_fn; /**< pointer to the memory allocation function */ + void* memAlloc_userdata; /**< user data for the malloc function */ conversion_fct_t* pFunctions; /**< the convertor functions pointer */ /* All others fields get modified for every call to pack/unpack functions */ uint32_t stack_pos; /**< the actual position on the stack */ @@ -133,7 +134,8 @@ ompi_convertor_set_position( ompi_convertor_t* convertor, OMPI_DECLSPEC int32_t ompi_convertor_personalize( ompi_convertor_t* pConv, uint32_t flags, size_t* starting_point, - memalloc_fct_t allocfn ); + memalloc_fct_t allocfn, + void* userdata ); /* * diff --git a/src/datatype/dt_pack.c b/src/datatype/dt_pack.c index 24c2f4a7a3..b2c25c1ede 100644 --- a/src/datatype/dt_pack.c +++ b/src/datatype/dt_pack.c @@ -84,7 +84,8 @@ int ompi_convertor_pack_general( ompi_convertor_t* pConvertor, if( (*max_data) < length ) length = *max_data; iov[iov_count].iov_len = length; - iov[iov_count].iov_base = pConvertor->memAlloc_fn( &(iov[iov_count].iov_len) ); + iov[iov_count].iov_base = pConvertor->memAlloc_fn( &(iov[iov_count].iov_len), + pConvertor->memAlloc_userdata ); *freeAfter = (*freeAfter) | ( 1 << iov_count); } pInput = iov[iov_count].iov_base; @@ -415,7 +416,8 @@ int ompi_convertor_pack_no_conversion( ompi_convertor_t* pConv, /* point to the end of loop element */ ddt_endloop_desc_t* end_loop = &(pElems[pos_desc + pElems[pos_desc].loop.items].end_loop); if( iov[iov_pos].iov_base == NULL ) { - iov[iov_pos].iov_base = pConv->memAlloc_fn( &(iov[iov_pos].iov_len) ); + iov[iov_pos].iov_base = pConv->memAlloc_fn( &(iov[iov_pos].iov_len), + pConv->memAlloc_userdata ); space_on_iovec = iov[iov_pos].iov_len; destination = iov[iov_pos].iov_base; (*freeAfter) |= (1 << iov_pos); @@ -499,7 +501,8 @@ int ompi_convertor_pack_no_conversion( ompi_convertor_t* pConv, break; } /* Let's allocate some. */ - iov[iov_pos].iov_base = pConv->memAlloc_fn( &(iov[iov_pos].iov_len) ); + iov[iov_pos].iov_base = pConv->memAlloc_fn( &(iov[iov_pos].iov_len), + pConv->memAlloc_userdata ); (*freeAfter) |= (1 << iov_pos); destination = iov[iov_pos].iov_base; space_on_iovec = iov[iov_pos].iov_len; @@ -705,7 +708,8 @@ ompi_convertor_pack_no_conv_contig_with_gaps( ompi_convertor_t* pConv, uint32_t done, counter; if( iov[iov_count].iov_base == NULL ) { - iov[iov_count].iov_base = pConv->memAlloc_fn( &(iov[iov_count].iov_len) ); + iov[iov_count].iov_base = pConv->memAlloc_fn( &(iov[iov_count].iov_len), + pConv->memAlloc_userdata ); (*freeAfter) |= (1 << 0); if( max_allowed < iov[iov_count].iov_len ) iov[iov_count].iov_len = max_allowed; @@ -761,7 +765,8 @@ ompi_convertor_prepare_for_send( ompi_convertor_t* convertor, } convertor->flags |= CONVERTOR_SEND | CONVERTOR_HOMOGENEOUS; - convertor->memAlloc_fn = NULL; + convertor->memAlloc_fn = NULL; + convertor->memAlloc_userdata = NULL; /* Just to avoid complaint from the compiler */ convertor->fAdvance = ompi_convertor_pack_general; convertor->fAdvance = ompi_convertor_pack_homogeneous_with_memcpy; diff --git a/src/datatype/dt_sndrcv.c b/src/datatype/dt_sndrcv.c index 78955a042a..16e4994f3a 100644 --- a/src/datatype/dt_sndrcv.c +++ b/src/datatype/dt_sndrcv.c @@ -68,7 +68,7 @@ int32_t ompi_ddt_sndrcv( void *sbuf, int32_t scount, const ompi_datatype_t* sdty if (rdtype == MPI_PACKED) { send_convertor = OBJ_NEW(ompi_convertor_t); ompi_convertor_prepare_for_send( send_convertor, sdtype, scount, sbuf ); - ompi_convertor_personalize( send_convertor, 0, 0, NULL ); + ompi_convertor_personalize( send_convertor, 0, 0, NULL, NULL ); iov_count = 1; iov.iov_len = rcount;