void MPIDI_Datatype_contents_printf(MPI_Datatype type, int depth, int acount) { int i; MPIDU_Datatype *dtp; MPIDU_Datatype_contents *cp; MPI_Aint *aints = NULL; MPI_Datatype *types = NULL; int *ints = NULL; if (HANDLE_GET_KIND(type) == HANDLE_KIND_BUILTIN) { MPL_DBG_OUT_FMT(MPIR_DBG_DATATYPE,(MPL_DBG_FDEST,"# %stype: %s\n", MPIDI_Datatype_depth_spacing(depth), MPIDU_Datatype_builtin_to_string(type))); return; } MPIDU_Datatype_get_ptr(type, dtp); cp = dtp->contents; if (cp == NULL) { MPL_DBG_OUT_FMT(MPIR_DBG_DATATYPE,(MPL_DBG_FDEST,"# <NULL>\n")); return; } if (cp->nr_ints > 0) { ints = (int *) MPL_malloc(cp->nr_ints * sizeof(int)); MPIDI_Datatype_get_contents_ints(cp, ints); } if (cp->nr_aints > 0) { aints = (MPI_Aint *) MPL_malloc(cp->nr_aints * sizeof(MPI_Aint)); MPIDI_Datatype_get_contents_aints(cp, aints); } if (cp->nr_types > 0) { types = (MPI_Datatype *) MPL_malloc(cp->nr_types * sizeof(MPI_Datatype)); MPIDI_Datatype_get_contents_types(cp, types); } MPL_DBG_OUT_FMT(MPIR_DBG_DATATYPE,(MPL_DBG_FDEST,"# %scombiner: %s", MPIDI_Datatype_depth_spacing(depth), MPIDU_Datatype_combiner_to_string(cp->combiner))); switch (cp->combiner) { case MPI_COMBINER_NAMED: case MPI_COMBINER_DUP: __mpidi_datatype_free_and_return; case MPI_COMBINER_RESIZED: /* not done */ __mpidi_datatype_free_and_return; case MPI_COMBINER_CONTIGUOUS: MPL_DBG_OUT_FMT(MPIR_DBG_DATATYPE,(MPL_DBG_FDEST,"# %scontig ct = %d\n", MPIDI_Datatype_depth_spacing(depth), *ints)); MPIDI_Datatype_contents_printf(*types, depth + 1, acount); __mpidi_datatype_free_and_return; case MPI_COMBINER_VECTOR: MPL_DBG_OUT_FMT(MPIR_DBG_DATATYPE,(MPL_DBG_FDEST, "# %svector ct = %d, blk = %d, str = %d\n", MPIDI_Datatype_depth_spacing(depth), ints[0], ints[1], ints[2])); MPIDI_Datatype_contents_printf(*types, depth + 1, acount); __mpidi_datatype_free_and_return; case MPI_COMBINER_HVECTOR: MPL_DBG_OUT_FMT(MPIR_DBG_DATATYPE,(MPL_DBG_FDEST, "# %shvector ct = %d, blk = %d, str = " MPI_AINT_FMT_DEC_SPEC "\n", MPIDI_Datatype_depth_spacing(depth), ints[0], ints[1], (MPI_Aint) aints[0])); MPIDI_Datatype_contents_printf(*types, depth + 1, acount); __mpidi_datatype_free_and_return; case MPI_COMBINER_INDEXED: MPL_DBG_OUT_FMT(MPIR_DBG_DATATYPE,(MPL_DBG_FDEST,"# %sindexed ct = %d:", MPIDI_Datatype_depth_spacing(depth), ints[0])); for (i=0; i < acount && i < ints[0]; i++) { MPL_DBG_OUT_FMT(MPIR_DBG_DATATYPE,(MPL_DBG_FDEST, "# %s indexed [%d]: blk = %d, disp = %d\n", MPIDI_Datatype_depth_spacing(depth), i, ints[i+1], ints[i+(cp->nr_ints/2)+1])); MPIDI_Datatype_contents_printf(*types, depth + 1, acount); } __mpidi_datatype_free_and_return; case MPI_COMBINER_HINDEXED: MPL_DBG_OUT_FMT(MPIR_DBG_DATATYPE,(MPL_DBG_FDEST,"# %shindexed ct = %d:", MPIDI_Datatype_depth_spacing(depth), ints[0])); for (i=0; i < acount && i < ints[0]; i++) { MPL_DBG_OUT_FMT(MPIR_DBG_DATATYPE,(MPL_DBG_FDEST, "# %s hindexed [%d]: blk = %d, disp = " MPI_AINT_FMT_DEC_SPEC "\n", MPIDI_Datatype_depth_spacing(depth), i, (int) ints[i+1], (MPI_Aint) aints[i])); MPIDI_Datatype_contents_printf(*types, depth + 1, acount); } __mpidi_datatype_free_and_return; case MPI_COMBINER_STRUCT: MPL_DBG_OUT_FMT(MPIR_DBG_DATATYPE,(MPL_DBG_FDEST,"# %sstruct ct = %d:", MPIDI_Datatype_depth_spacing(depth), (int) ints[0])); for (i=0; i < acount && i < ints[0]; i++) { MPL_DBG_OUT_FMT(MPIR_DBG_DATATYPE,(MPL_DBG_FDEST, "# %s struct[%d]: blk = %d, disp = " MPI_AINT_FMT_DEC_SPEC "\n", MPIDI_Datatype_depth_spacing(depth), i, (int) ints[i+1], (MPI_Aint) aints[i])); MPIDI_Datatype_contents_printf(types[i], depth + 1, acount); } __mpidi_datatype_free_and_return; case MPI_COMBINER_SUBARRAY: MPL_DBG_OUT_FMT(MPIR_DBG_DATATYPE, (MPL_DBG_FDEST,"# %ssubarray ct = %d:", MPIDI_Datatype_depth_spacing(depth), (int) ints[0])); for (i=0; i< acount && i < ints[0]; i++) { MPL_DBG_OUT_FMT(MPIR_DBG_DATATYPE,(MPL_DBG_FDEST, "# %s sizes[%d] = %d subsizes[%d] = %d starts[%d] = %d\n", MPIDI_Datatype_depth_spacing(depth), i, (int)ints[i+1], i, (int)ints[i+ ints[0]+1], i, (int)ints[2*ints[0]+1])); } MPIDI_Datatype_contents_printf(*types, depth + 1, acount); __mpidi_datatype_free_and_return; default: MPL_DBG_OUT_FMT(MPIR_DBG_DATATYPE,(MPL_DBG_FDEST,"# %sunhandled combiner", MPIDI_Datatype_depth_spacing(depth))); __mpidi_datatype_free_and_return; } }
/*@ MPID_Type_get_contents - get content information from datatype Input Parameters: + datatype - MPI datatype . max_integers - size of array_of_integers . max_addresses - size of array_of_addresses - max_datatypes - size of array_of_datatypes Output Parameters: + array_of_integers - integers used in creating type . array_of_addresses - MPI_Aints used in creating type - array_of_datatypes - MPI_Datatypes used in creating type @*/ int MPID_Type_get_contents(MPI_Datatype datatype, int max_integers, int max_addresses, int max_datatypes, int array_of_integers[], MPI_Aint array_of_addresses[], MPI_Datatype array_of_datatypes[]) { int i, mpi_errno; MPID_Datatype *dtp; MPID_Datatype_contents *cp; /* --BEGIN ERROR HANDLING-- */ /* these are checked at the MPI layer, so I feel that asserts * are appropriate. */ MPIU_Assert(HANDLE_GET_KIND(datatype) != HANDLE_KIND_BUILTIN); MPIU_Assert(datatype != MPI_FLOAT_INT && datatype != MPI_DOUBLE_INT && datatype != MPI_LONG_INT && datatype != MPI_SHORT_INT && datatype != MPI_LONG_DOUBLE_INT); /* --END ERROR HANDLING-- */ MPID_Datatype_get_ptr(datatype, dtp); cp = dtp->contents; MPIU_Assert(cp != NULL); /* --BEGIN ERROR HANDLING-- */ if (max_integers < cp->nr_ints || max_addresses < cp->nr_aints || max_datatypes < cp->nr_types) { mpi_errno = MPIR_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE, "MPID_Type_get_contents", __LINE__, MPI_ERR_OTHER, "**dtype", 0); return mpi_errno; } /* --END ERROR HANDLING-- */ if (cp->nr_ints > 0) { MPIDI_Datatype_get_contents_ints(cp, array_of_integers); } if (cp->nr_aints > 0) { MPIDI_Datatype_get_contents_aints(cp, array_of_addresses); } if (cp->nr_types > 0) { MPIDI_Datatype_get_contents_types(cp, array_of_datatypes); } for (i=0; i < cp->nr_types; i++) { if (HANDLE_GET_KIND(array_of_datatypes[i]) != HANDLE_KIND_BUILTIN) { MPID_Datatype_get_ptr(array_of_datatypes[i], dtp); MPID_Datatype_add_ref(dtp); } } return MPI_SUCCESS; }