Correct a unpack bug related to the size of the unpacked object.
This commit was SVN r5487.
Этот коммит содержится в:
родитель
9b090e7e71
Коммит
d6b1d9805f
@ -176,7 +176,7 @@ static int ompi_convertor_unpack_homogeneous( ompi_convertor_t* pConv,
|
|||||||
long lastDisp = 0;
|
long lastDisp = 0;
|
||||||
size_t space = iov[0].iov_len, last_count = 0, last_blength = 0;
|
size_t space = iov[0].iov_len, last_count = 0, last_blength = 0;
|
||||||
char* pSrcBuf;
|
char* pSrcBuf;
|
||||||
dt_desc_t* pData = pConv->pDesc;
|
ompi_datatype_t* pData = pConv->pDesc;
|
||||||
dt_elem_desc_t* pElems;
|
dt_elem_desc_t* pElems;
|
||||||
|
|
||||||
pSrcBuf = iov[0].iov_base;
|
pSrcBuf = iov[0].iov_base;
|
||||||
@ -251,19 +251,33 @@ static int ompi_convertor_unpack_homogeneous( ompi_convertor_t* pConv,
|
|||||||
while( pElems[pos_desc].flags & DT_FLAG_DATA ) {
|
while( pElems[pos_desc].flags & DT_FLAG_DATA ) {
|
||||||
/* do we have enough space in the buffer ? */
|
/* do we have enough space in the buffer ? */
|
||||||
last_blength = last_count * ompi_ddt_basicDatatypes[pElems[pos_desc].type]->size;
|
last_blength = last_count * ompi_ddt_basicDatatypes[pElems[pos_desc].type]->size;
|
||||||
if( space < last_blength ) {
|
if( pElems[pos_desc].flags & DT_FLAG_CONTIGUOUS ) {
|
||||||
last_blength = space / ompi_ddt_basicDatatypes[pElems[pos_desc].type]->size;
|
if( space < last_blength ) {
|
||||||
last_count -= last_blength;
|
last_blength = space / ompi_ddt_basicDatatypes[pElems[pos_desc].type]->size;
|
||||||
last_blength *= ompi_ddt_basicDatatypes[pElems[pos_desc].type]->size;
|
last_count -= last_blength;
|
||||||
|
last_blength *= ompi_ddt_basicDatatypes[pElems[pos_desc].type]->size;
|
||||||
|
space -= last_blength;
|
||||||
|
goto end_loop; /* or break whatever but go out of this while */
|
||||||
|
}
|
||||||
|
OMPI_DDT_SAFEGUARD_POINTER( pConv->pBaseBuf + lastDisp, last_blength,
|
||||||
|
pConv->pBaseBuf, pData, pConv->count );
|
||||||
|
MEMCPY( pConv->pBaseBuf + lastDisp, pSrcBuf, last_blength );
|
||||||
|
bConverted += last_blength;
|
||||||
space -= last_blength;
|
space -= last_blength;
|
||||||
goto end_loop; /* or break whatever but go out of this while */
|
pSrcBuf += last_blength;
|
||||||
|
} else {
|
||||||
|
uint32_t i;
|
||||||
|
|
||||||
|
last_blength = ompi_ddt_basicDatatypes[pElems[pos_desc].type]->size;
|
||||||
|
for( i = 0; i < last_count; i++ ) {
|
||||||
|
OMPI_DDT_SAFEGUARD_POINTER( pConv->pBaseBuf + lastDisp, last_blength,
|
||||||
|
pConv->pBaseBuf, pData, pConv->count );
|
||||||
|
MEMCPY( pConv->pBaseBuf + lastDisp, pSrcBuf, last_blength );
|
||||||
|
lastDisp += pElems[pos_desc].extent;
|
||||||
|
pSrcBuf += ompi_ddt_basicDatatypes[pElems[pos_desc].type]->size;
|
||||||
|
}
|
||||||
|
bConverted += ompi_ddt_basicDatatypes[pElems[pos_desc].type]->size * last_count;
|
||||||
}
|
}
|
||||||
OMPI_DDT_SAFEGUARD_POINTER( pConv->pBaseBuf + lastDisp, last_blength,
|
|
||||||
pConv->pBaseBuf, pData, pConv->count );
|
|
||||||
MEMCPY( pConv->pBaseBuf + lastDisp, pSrcBuf, last_blength );
|
|
||||||
bConverted += last_blength;
|
|
||||||
space -= last_blength;
|
|
||||||
pSrcBuf += last_blength;
|
|
||||||
pos_desc++; /* advance to the next data */
|
pos_desc++; /* advance to the next data */
|
||||||
lastDisp = pStack->disp + pElems[pos_desc].disp;
|
lastDisp = pStack->disp + pElems[pos_desc].disp;
|
||||||
last_count = pElems[pos_desc].count;
|
last_count = pElems[pos_desc].count;
|
||||||
@ -296,7 +310,7 @@ static int ompi_convertor_unpack_homogeneous_contig( ompi_convertor_t* pConv,
|
|||||||
uint32_t* max_data,
|
uint32_t* max_data,
|
||||||
int32_t* freeAfter )
|
int32_t* freeAfter )
|
||||||
{
|
{
|
||||||
dt_desc_t *pData = pConv->pDesc;
|
ompi_datatype_t *pData = pConv->pDesc;
|
||||||
char* pDstBuf = pConv->pBaseBuf;
|
char* pDstBuf = pConv->pBaseBuf;
|
||||||
char* pSrcBuf = iov[0].iov_base;
|
char* pSrcBuf = iov[0].iov_base;
|
||||||
int bConverted = 0;
|
int bConverted = 0;
|
||||||
@ -606,7 +620,7 @@ int32_t ompi_convertor_need_buffers( ompi_convertor_t* pConvertor )
|
|||||||
|
|
||||||
extern int ompi_ddt_local_sizes[DT_MAX_PREDEFINED];
|
extern int ompi_ddt_local_sizes[DT_MAX_PREDEFINED];
|
||||||
int32_t ompi_convertor_init_for_recv( ompi_convertor_t* pConv, uint32_t flags,
|
int32_t ompi_convertor_init_for_recv( ompi_convertor_t* pConv, uint32_t flags,
|
||||||
const dt_desc_t* datatype, int32_t count,
|
const ompi_datatype_t* datatype, int32_t count,
|
||||||
const void* pUserBuf, int32_t starting_point,
|
const void* pUserBuf, int32_t starting_point,
|
||||||
memalloc_fct_t allocfn )
|
memalloc_fct_t allocfn )
|
||||||
{
|
{
|
||||||
@ -642,7 +656,7 @@ int32_t ompi_convertor_init_for_recv( ompi_convertor_t* pConv, uint32_t flags,
|
|||||||
* positive = number of basic elements inside
|
* positive = number of basic elements inside
|
||||||
* negative = some error occurs
|
* negative = some error occurs
|
||||||
*/
|
*/
|
||||||
int32_t ompi_ddt_get_element_count( const dt_desc_t* datatype, int32_t iSize )
|
int32_t ompi_ddt_get_element_count( const ompi_datatype_t* datatype, int32_t iSize )
|
||||||
{
|
{
|
||||||
dt_stack_t* pStack; /* pointer to the position on the stack */
|
dt_stack_t* pStack; /* pointer to the position on the stack */
|
||||||
uint32_t pos_desc; /* actual position in the description of the derived datatype */
|
uint32_t pos_desc; /* actual position in the description of the derived datatype */
|
||||||
@ -650,10 +664,9 @@ int32_t ompi_ddt_get_element_count( const dt_desc_t* datatype, int32_t iSize )
|
|||||||
int rc, nbElems = 0;
|
int rc, nbElems = 0;
|
||||||
int stack_pos = 0;
|
int stack_pos = 0;
|
||||||
|
|
||||||
/* Normally the size should be less or equal to the size of the datatype. But we still can protect here */
|
/* Normally the size should be less or equal to the size of the datatype.
|
||||||
if( datatype->size > (uint32_t)iSize ) {
|
* This function does not support a iSize bigger than the size of the datatype.
|
||||||
return -1;
|
*/
|
||||||
}
|
|
||||||
|
|
||||||
DUMP( "dt_count_elements( %p, %d )\n", (void*)datatype, iSize );
|
DUMP( "dt_count_elements( %p, %d )\n", (void*)datatype, iSize );
|
||||||
pStack = alloca( sizeof(dt_stack_t) * (datatype->btypes[DT_LOOP] + 2) );
|
pStack = alloca( sizeof(dt_stack_t) * (datatype->btypes[DT_LOOP] + 2) );
|
||||||
@ -693,8 +706,10 @@ int32_t ompi_ddt_get_element_count( const dt_desc_t* datatype, int32_t iSize )
|
|||||||
type = datatype->desc.desc[pos_desc].type;
|
type = datatype->desc.desc[pos_desc].type;
|
||||||
rc = datatype->desc.desc[pos_desc].count * ompi_ddt_basicDatatypes[type]->size;
|
rc = datatype->desc.desc[pos_desc].count * ompi_ddt_basicDatatypes[type]->size;
|
||||||
if( rc >= iSize ) {
|
if( rc >= iSize ) {
|
||||||
nbElems += iSize / ompi_ddt_basicDatatypes[type]->size;
|
rc = iSize / ompi_ddt_basicDatatypes[type]->size;
|
||||||
break;
|
nbElems += rc;
|
||||||
|
iSize -= rc * ompi_ddt_basicDatatypes[type]->size;
|
||||||
|
return (iSize == 0 ? nbElems : -1);
|
||||||
}
|
}
|
||||||
nbElems += datatype->desc.desc[pos_desc].count;
|
nbElems += datatype->desc.desc[pos_desc].count;
|
||||||
iSize -= rc;
|
iSize -= rc;
|
||||||
@ -703,10 +718,10 @@ int32_t ompi_ddt_get_element_count( const dt_desc_t* datatype, int32_t iSize )
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* cleanup the stack */
|
/* cleanup the stack */
|
||||||
return nbElems;
|
return -1; /* never reached */
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t ompi_ddt_copy_content_same_ddt( const dt_desc_t* datatype, int32_t count,
|
int32_t ompi_ddt_copy_content_same_ddt( const ompi_datatype_t* datatype, int32_t count,
|
||||||
char* pDestBuf, const char* pSrcBuf )
|
char* pDestBuf, const char* pSrcBuf )
|
||||||
{
|
{
|
||||||
dt_stack_t* pStack; /* pointer to the position on the stack */
|
dt_stack_t* pStack; /* pointer to the position on the stack */
|
||||||
|
Загрузка…
x
Ссылка в новой задаче
Block a user