Update the contiguous homogeneous unpack function.
This commit was SVN r3284.
Этот коммит содержится в:
родитель
47777b884c
Коммит
49e35c869b
@ -287,7 +287,7 @@ static int ompi_convertor_unpack_homogeneous_contig( ompi_convertor_t* pConv,
|
|||||||
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;
|
||||||
long jump, extent = pData->ub - pData->lb;
|
long extent = pData->ub - pData->lb;
|
||||||
unsigned int length, remaining, i;
|
unsigned int length, remaining, i;
|
||||||
dt_stack_t* stack = &(pConv->pStack[1]);
|
dt_stack_t* stack = &(pConv->pStack[1]);
|
||||||
|
|
||||||
@ -307,19 +307,30 @@ static int ompi_convertor_unpack_homogeneous_contig( ompi_convertor_t* pConv,
|
|||||||
} else {
|
} else {
|
||||||
pDstBuf += stack->disp;
|
pDstBuf += stack->disp;
|
||||||
|
|
||||||
length = pConv->bConverted / pData->size;
|
length = pConv->bConverted / pData->size; /* already done */
|
||||||
length = pConv->bConverted - length * pData->size;
|
length = pConv->bConverted - length * pData->size; /* still left on the last element */
|
||||||
jump = extent - length;
|
|
||||||
remaining = iov[0].iov_len;
|
remaining = iov[0].iov_len;
|
||||||
|
|
||||||
for( i = 0; remaining < length; i++ ) {
|
/* complete the last copy */
|
||||||
|
if( length != 0 ) {
|
||||||
OMPI_DDT_SAFEGUARD_POINTER( pDstBuf, length, pConv->pBaseBuf, pData, pConv->count );
|
OMPI_DDT_SAFEGUARD_POINTER( pDstBuf, length, pConv->pBaseBuf, pData, pConv->count );
|
||||||
MEMCPY( pDstBuf, pSrcBuf, length );
|
MEMCPY( pDstBuf, pSrcBuf, length );
|
||||||
pSrcBuf += length;
|
pSrcBuf += length;
|
||||||
pDstBuf += jump;
|
pDstBuf += (extent - length);
|
||||||
remaining -= length;
|
remaining -= length;
|
||||||
length = pData->size;
|
}
|
||||||
jump = extent;
|
for( i = 0; pData->size <= remaining; i++ ) {
|
||||||
|
OMPI_DDT_SAFEGUARD_POINTER( pDstBuf, pData->size, pConv->pBaseBuf, pData, pConv->count );
|
||||||
|
MEMCPY( pDstBuf, pSrcBuf, pData->size );
|
||||||
|
pSrcBuf += pData->size;
|
||||||
|
pDstBuf += extent;
|
||||||
|
remaining -= pData->size;
|
||||||
|
}
|
||||||
|
/* copy the last bits */
|
||||||
|
if( remaining != 0 ) {
|
||||||
|
OMPI_DDT_SAFEGUARD_POINTER( pDstBuf, remaining, pConv->pBaseBuf, pData, pConv->count );
|
||||||
|
MEMCPY( pDstBuf, pSrcBuf, remaining );
|
||||||
|
pDstBuf += remaining;
|
||||||
}
|
}
|
||||||
bConverted += iov[0].iov_len;
|
bConverted += iov[0].iov_len;
|
||||||
stack->disp = pDstBuf - pConv->pBaseBuf; /* save the position */
|
stack->disp = pDstBuf - pConv->pBaseBuf; /* save the position */
|
||||||
|
Загрузка…
x
Ссылка в новой задаче
Block a user