int opal_datatype_dump_data_desc( dt_elem_desc_t* pDesc, int nbElems, char* ptr, size_t length ) { int i; int32_t index = 0; for( i = 0; i < nbElems; i++ ) { index += opal_datatype_dump_data_flags( pDesc->elem.common.flags, ptr + index, length ); if( length <= (size_t)index ) break; index += snprintf( ptr + index, length - index, "%15s ", opal_datatype_basicDatatypes[pDesc->elem.common.type]->name ); if( length <= (size_t)index ) break; if( OPAL_DATATYPE_LOOP == pDesc->elem.common.type ) index += snprintf( ptr + index, length - index, "%d times the next %d elements extent %d\n", (int)pDesc->loop.loops, (int)pDesc->loop.items, (int)pDesc->loop.extent ); else if( OPAL_DATATYPE_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, (long)pDesc->end_loop.first_elem_disp, (int)pDesc->end_loop.size ); else index += snprintf( ptr + index, length - index, "count %d disp 0x%lx (%ld) blen %d extent %d (size %ld)\n", (int)pDesc->elem.count, (long)pDesc->elem.disp, (long)pDesc->elem.disp, (int)pDesc->elem.blocklen, (int)pDesc->elem.extent, (long)(pDesc->elem.count * opal_datatype_basicDatatypes[pDesc->elem.common.type]->size) ); pDesc++; if( length <= (size_t)index ) break; } return index; }
static int _ompi_dump_data_flags( unsigned short usflags, char* ptr, size_t length ) { int index = 0; if( length < 22 ) return 0; /* The lower-level part is the responsibility of opal_datatype_dump_data_flags */ index += opal_datatype_dump_data_flags (usflags, ptr, length); /* Which kind of datatype is that */ switch( usflags & OMPI_DATATYPE_FLAG_DATA_LANGUAGE ) { case OMPI_DATATYPE_FLAG_DATA_C: ptr[12] = ' '; ptr[13] = 'C'; ptr[14] = ' '; break; case OMPI_DATATYPE_FLAG_DATA_CPP: ptr[12] = 'C'; ptr[13] = 'P'; ptr[14] = 'P'; break; case OMPI_DATATYPE_FLAG_DATA_FORTRAN: ptr[12] = 'F'; ptr[13] = '7'; ptr[14] = '7'; break; default: if( usflags & OMPI_DATATYPE_FLAG_PREDEFINED ) { ptr[12] = 'E'; ptr[13] = 'R'; ptr[14] = 'R'; break; } } switch( usflags & OMPI_DATATYPE_FLAG_DATA_TYPE ) { case OMPI_DATATYPE_FLAG_DATA_INT: ptr[17] = 'I'; ptr[18] = 'N'; ptr[19] = 'T'; break; case OMPI_DATATYPE_FLAG_DATA_FLOAT: ptr[17] = 'F'; ptr[18] = 'L'; ptr[19] = 'T'; break; case OMPI_DATATYPE_FLAG_DATA_COMPLEX: ptr[17] = 'C'; ptr[18] = 'P'; ptr[19] = 'L'; break; default: if( usflags & OMPI_DATATYPE_FLAG_PREDEFINED ) { ptr[17] = 'E'; ptr[18] = 'R'; ptr[19] = 'R'; break; } } return index; }
void opal_datatype_dump( const opal_datatype_t* pData ) { size_t length; int index = 0; char* buffer; length = pData->opt_desc.used + pData->desc.used; length = length * 100 + 500; buffer = (char*)malloc( length ); index += snprintf( buffer, length - index, "Datatype %p[%s] size %ld align %d id %d length %d used %d\n" "true_lb %ld true_ub %ld (true_extent %ld) lb %ld ub %ld (extent %ld)\n" "nbElems %d loops %d flags %X (", (void*)pData, pData->name, (long)pData->size, (int)pData->align, pData->id, (int)pData->desc.length, (int)pData->desc.used, (long)pData->true_lb, (long)pData->true_ub, (long)(pData->true_ub - pData->true_lb), (long)pData->lb, (long)pData->ub, (long)(pData->ub - pData->lb), (int)pData->nbElems, (int)pData->btypes[OPAL_DATATYPE_LOOP], (int)pData->flags ); /* dump the flags */ if( pData->flags == OPAL_DATATYPE_FLAG_PREDEFINED ) index += snprintf( buffer + index, length - index, "predefined " ); else { if( pData->flags & OPAL_DATATYPE_FLAG_COMMITTED ) index += snprintf( buffer + index, length - index, "committed " ); if( pData->flags & OPAL_DATATYPE_FLAG_CONTIGUOUS) index += snprintf( buffer + index, length - index, "contiguous " ); } index += snprintf( buffer + index, length - index, ")" ); index += opal_datatype_dump_data_flags( pData->flags, buffer + index, length - index ); { index += snprintf( buffer + index, length - index, "\n contain " ); index += opal_datatype_contain_basic_datatypes( pData, buffer + index, length - index ); index += snprintf( buffer + index, length - index, "\n" ); } if( (pData->opt_desc.desc != pData->desc.desc) && (NULL != pData->opt_desc.desc) ) { /* If the data is already committed print everything including the last * fake OPAL_DATATYPE_END_LOOP entry. */ index += opal_datatype_dump_data_desc( pData->desc.desc, pData->desc.used + 1, buffer + index, length - index ); index += snprintf( buffer + index, length - index, "Optimized description \n" ); index += opal_datatype_dump_data_desc( pData->opt_desc.desc, pData->opt_desc.used + 1, buffer + index, length - index ); } else { index += opal_datatype_dump_data_desc( pData->desc.desc, pData->desc.used, buffer + index, length - index ); index += snprintf( buffer + index, length - index, "No optimized description\n" ); } buffer[index] = '\0'; /* make sure we end the string with 0 */ opal_output( 0, "%s\n", buffer ); free(buffer); }