Index: new_position.c =================================================================== --- new_position.c (revision 8976) +++ new_position.c (working copy) @@ -1,12 +1,12 @@ /* -*- Mode: C; c-basic-offset:4 ; -*- */ /* - * Copyright (c) 2004-2005 The Trustees of Indiana University. + * Copyright (c) 2004-2006 The Trustees of Indiana University. * All rights reserved. - * Copyright (c) 2004-2005 The Trustees of the University of Tennessee. + * Copyright (c) 2004-2006 The Trustees of the University of Tennessee. * All rights reserved. - * Copyright (c) 2004-2005 High Performance Computing Center Stuttgart, + * Copyright (c) 2004-2006 High Performance Computing Center Stuttgart, * University of Stuttgart. All rights reserved. - * Copyright (c) 2004-2005 The Regents of the University of California. + * Copyright (c) 2004-2006 The Regents of the University of California. * All rights reserved. * $COPYRIGHT$ * @@ -26,10 +26,13 @@ #endif #include -static int ompi_pack_debug=0; +#if OMPI_ENABLE_DEBUG +int32_t ompi_position_debug = 0; +#define DO_DEBUG(INST) if( ompi_position_debug ) { INST } +#else +#define DO_DEBUG(INST) +#endif /* OMPI_ENABLE_DEBUG */ -#define DO_DEBUG(INST) if( ompi_pack_debug ) { INST } - /* The pack/unpack functions need a cleanup. I have to create a proper interface to access * all basic functionalities, hence using them as basic blocks for all conversion functions. * @@ -215,6 +218,10 @@ (*position) -= iov_len_local; pConvertor->bConverted = *position; /* update the already converted bytes */ assert( iov_len_local >= 0 ); + if( (pConvertor->pending_length != iov_len_local) && + (pConvertor->flags & CONVERTOR_RECV) ) { + opal_output( 0, "Missing some data ?" ); + } if( !(pConvertor->flags & CONVERTOR_COMPLETED) ) { /* I complete an element, next step I should go to the next one */ PUSH_STACK( pStack, pConvertor->stack_pos, pos_desc, DT_BYTE, count_desc, Index: new_unpack.c =================================================================== --- new_unpack.c (revision 8976) +++ new_unpack.c (working copy) @@ -1,14 +1,12 @@ /* -*- Mode: C; c-basic-offset:4 ; -*- */ /* - * Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana - * University Research and Technology - * Corporation. All rights reserved. - * Copyright (c) 2004-2005 The University of Tennessee and The University - * of Tennessee Research Foundation. All rights - * reserved. - * Copyright (c) 2004-2005 High Performance Computing Center Stuttgart, + * Copyright (c) 2004-2006 The Trustees of Indiana University. + * All rights reserved. + * Copyright (c) 2004-2006 The Trustees of the University of Tennessee. + * All rights reserved. + * Copyright (c) 2004-2006 High Performance Computing Center Stuttgart, * University of Stuttgart. All rights reserved. - * Copyright (c) 2004-2005 The Regents of the University of California. + * Copyright (c) 2004-2006 The Regents of the University of California. * All rights reserved. * $COPYRIGHT$ * @@ -265,19 +263,20 @@ } } complete_loop: - iov[iov_count].iov_len -= iov_len_local; /* update the amount of valid data */ - total_unpacked += iov[iov_count].iov_len; - pConvertor->bConverted += iov[iov_count].iov_len; /* update the already converted bytes */ - assert( iov_len_local >= 0 ); if( !(pConvertor->flags & CONVERTOR_COMPLETED) && (0 != iov_len_local) ) { /* We have some partial data here. Let's copy it into the convertor * and keep it hot until the next round. */ - assert( iov_len_local < 16 ); + assert( iov_len_local < ompi_ddt_basicDatatypes[type]->size ); memcpy( pConvertor->pending, packed_buffer, iov_len_local ); DO_DEBUG( opal_output( 0, "Saving %d bytes for the next call\n", iov_len_local ); ); pConvertor->pending_length = iov_len_local; + iov_len_local = 0; } + iov[iov_count].iov_len -= iov_len_local; /* update the amount of valid data */ + total_unpacked += iov[iov_count].iov_len; + pConvertor->bConverted += iov[iov_count].iov_len; /* update the already converted bytes */ + assert( iov_len_local >= 0 ); } *max_data = total_unpacked; *out_size = iov_count; Index: dt_module.c =================================================================== --- dt_module.c (revision 8976) +++ dt_module.c (working copy) @@ -26,6 +26,7 @@ extern int32_t ompi_unpack_debug; extern int32_t ompi_pack_debug; extern int32_t ompi_copy_debug; +extern int32_t ompi_position_debug; #endif /* OMPI_ENABLE_DEBUG */ extern size_t ompi_datatype_memcpy_block_size; @@ -542,6 +543,8 @@ false, false, 0, &ompi_unpack_debug ); mca_base_param_reg_int_name( "datatype", "pack_debug", "Non zero lead to output generated by the pack functions", false, false, 0, &ompi_pack_debug ); + mca_base_param_reg_int_name( "datatype", "position_debug", "Non zero lead to output generated by the datatype position functions", + false, false, 0, &ompi_position_debug ); mca_base_param_reg_int_name( "datatype", "copy_debug", "Non zero lead to output generated by the local copy functions", false, false, 0, &ompi_copy_debug ); #endif /* OMPI_ENABLE_DEBUG */ @@ -642,12 +645,12 @@ (int)pDesc->loop.extent ); else if( DT_END_LOOP == pDesc->elem.common.type ) index += snprintf( ptr + index, length - index, "prev %d elements first elem displacement %ld size of data %d\n", - (int)pDesc->end_loop.items, pDesc->end_loop.first_elem_disp, - (int)pDesc->end_loop.size ); + (int)pDesc->end_loop.items, pDesc->end_loop.first_elem_disp, + (int)pDesc->end_loop.size ); else - index += snprintf( ptr + index, length - index, "count %d disp 0x%lx (%ld) extent %d\n", + index += snprintf( ptr + index, length - index, "count %d disp 0x%lx (%ld) extent %d (size %ld)\n", (int)pDesc->elem.count, pDesc->elem.disp, pDesc->elem.disp, - (int)pDesc->elem.extent ); + (int)pDesc->elem.extent, pDesc->elem.count * ompi_ddt_basicDatatypes[pDesc->elem.common.type]->size ); pDesc++; if( length <= index ) break;