1
1

Call the new unpack function from the new_unpack.c

The cleanup of the pack/unpack framework will follow shortly.

This commit was SVN r7286.
Этот коммит содержится в:
George Bosilca 2005-09-09 23:38:31 +00:00
родитель 35676f0c75
Коммит 41c2dc6a79
2 изменённых файлов: 21 добавлений и 11 удалений

Просмотреть файл

@ -39,7 +39,6 @@ int ompi_ddt_dfd = -1;
0/*lb*/, 0/*ub*/, DT_FLAG_PREDEFINED, TYPE, 1, \
(((unsigned long long)1)<<(TYPE)), EMPTY_DATA(NAME) }
#define INIT_BASIC_DATA( TYPE, ALIGN, NAME, FLAGS ) \
{ BASEOBJ_DATA, sizeof(TYPE), ALIGN, 0, sizeof(TYPE), \
0, sizeof(TYPE), DT_FLAG_BASIC | (FLAGS), \

Просмотреть файл

@ -95,8 +95,10 @@ static int ompi_convertor_unpack_general( ompi_convertor_t* pConvertor,
while( 1 ) {
if( DT_END_LOOP == pElems[pos_desc].elem.common.type ) { /* end of the current loop */
if( --(pStack->count) == 0 ) { /* end of loop */
if( pConvertor->stack_pos == 0 )
if( pConvertor->stack_pos == 0 ) {
pConvertor->flags |= CONVERTOR_COMPLETED;
goto save_and_return; /* completed */
}
pConvertor->stack_pos--;
pStack--;
}
@ -158,13 +160,13 @@ static int ompi_convertor_unpack_general( ompi_convertor_t* pConvertor,
/* out of the loop: we have complete the data conversion or no more space
* in the buffer.
*/
if( pConvertor->pStack[0].count < 0 ) return 1; /* data succesfully converted */
if( pConvertor->flags & CONVERTOR_COMPLETED ) return 1; /* data succesfully converted */
/* I complete an element, next step I should go to the next one */
PUSH_STACK( pStack, pConvertor->stack_pos, pos_desc, type,
count_desc, disp_desc, pos_desc );
return (pConvertor->bConverted == (pConvertor->count * pConvertor->pDesc->size));
return 0;
}
static int ompi_convertor_unpack_homogeneous( ompi_convertor_t* pConv,
@ -200,6 +202,7 @@ static int ompi_convertor_unpack_homogeneous( ompi_convertor_t* pConv,
if( --(pStack->count) == 0 ) { /* end of loop */
if( pConv->stack_pos == 0 ) {
last_blength = 0; /* nothing to copy anymore */
pConv->flags |= CONVERTOR_COMPLETED;
goto end_loop;
}
pStack--;
@ -301,16 +304,17 @@ static int ompi_convertor_unpack_homogeneous( ompi_convertor_t* pConv,
bConverted += last_blength;
lastDisp += last_blength;
}
if( pos_desc < (uint32_t)pStack->end_loop ) { /* update the stack */
PUSH_STACK( pStack, pConv->stack_pos, pos_desc, pElems[pos_desc].elem.common.type,
last_count, lastDisp, pos_desc );
}
pConv->bConverted += bConverted; /* update the converted field */
iov[0].iov_len = bConverted; /* update the iovec length */
*max_data = bConverted;
return (pConv->bConverted == (pConv->count * pData->size));
if( pConv->flags & CONVERTOR_COMPLETED ) { /* finish thus do not update the stack */
return 1;
}
PUSH_STACK( pStack, pConv->stack_pos, pos_desc, pElems[pos_desc].elem.common.type,
last_count, lastDisp, pos_desc );
return 0;
}
static int ompi_convertor_unpack_homogeneous_contig( ompi_convertor_t* pConv,
@ -372,7 +376,11 @@ static int ompi_convertor_unpack_homogeneous_contig( ompi_convertor_t* pConv,
}
*out_size = iov_count;
*max_data = (pConv->bConverted - initial_bytes_converted);
return (pConv->bConverted == (pData->size * pConv->count));
if( pConv->bConverted == (pData->size * pConv->count) ) {
pConv->flags |= CONVERTOR_COMPLETED;
return 1;
}
return 0;
}
/* Return value:
@ -643,6 +651,7 @@ ompi_convertor_prepare_for_recv( ompi_convertor_t* convertor,
convertor->memAlloc_fn = NULL;
convertor->fAdvance = ompi_convertor_unpack_general; /* TODO: just stop complaining */
convertor->fAdvance = ompi_convertor_unpack_homogeneous; /* default behaviour */
convertor->fAdvance = ompi_convertor_generic_simple_unpack;
/* TODO: work only on homogeneous architectures */
if( convertor->pDesc->flags & DT_FLAG_CONTIGUOUS ) {
@ -813,7 +822,9 @@ int32_t ompi_ddt_copy_content_same_ddt( const ompi_datatype_t* datatype, int32_t
if( DT_END_LOOP == pElems[pos_desc].elem.common.type ) { /* end of the current loop */
if( --(pStack->count) == 0 ) { /* end of loop */
pStack--;
if( --stack_pos == -1 ) goto end_loop;
if( --stack_pos == -1 ) {
goto end_loop;
}
DDT_DUMP_STACK( pStack, stack_pos, pElems, "loop finish" );
pos_desc++;
} else {