int main(int argc, char *argv[]) { int errs = 0; int key[3], attrval[3]; int i; MPI_Comm comm; MPI_Init(&argc, &argv); comm = MPI_COMM_WORLD; /* Create key values */ for (i=0; i<3; i++) { MPI_Comm_create_keyval(MPI_NULL_COPY_FN, MPI_NULL_DELETE_FN, &key[i], (void*)0); attrval[i] = 1024*i; } /* Insert attribute in several orders. Test after put with get. */ MPI_Comm_set_attr(comm, key[2], &attrval[2]); MPI_Comm_set_attr(comm, key[1], &attrval[1]); MPI_Comm_set_attr(comm, key[0], &attrval[0]); errs += checkAttrs(comm, 3, key, attrval); MPI_Comm_delete_attr(comm, key[0]); MPI_Comm_delete_attr(comm, key[1]); MPI_Comm_delete_attr(comm, key[2]); errs += checkNoAttrs(comm,3,key); for (i=0;i<3;i++) { MPI_Comm_free_keyval(&key[i]); } MPI_Finalize(); return 0; }
void ompi_comm_delete_attr_f(MPI_Fint *comm, MPI_Fint *comm_keyval, MPI_Fint *ierr) { int c_ierr; MPI_Comm c_comm; c_comm = MPI_Comm_f2c(*comm); c_ierr = MPI_Comm_delete_attr(c_comm, OMPI_FINT_2_INT(*comm_keyval)); if (NULL != ierr) *ierr = OMPI_INT_2_FINT(c_ierr); }
int test_communicators(void) { MPI_Comm dup_comm_world, d2; int world_rank, world_size, key_1; int err, errs = 0; MPI_Aint value; MPI_Comm_rank(MPI_COMM_WORLD, &world_rank); MPI_Comm_size(MPI_COMM_WORLD, &world_size); #ifdef DEBUG if (world_rank == 0) { printf("*** Attribute copy/delete return codes ***\n"); } #endif MPI_Comm_dup(MPI_COMM_WORLD, &dup_comm_world); MPI_Barrier(dup_comm_world); MPI_Errhandler_set(dup_comm_world, MPI_ERRORS_RETURN); value = -11; if ((err = MPI_Comm_create_keyval(copybomb_fn, deletebomb_fn, &key_1, &value))) abort_msg("Keyval_create", err); err = MPI_Comm_set_attr(dup_comm_world, key_1, (void *) (MPI_Aint) world_rank); if (err) { errs++; printf("Error with first put\n"); } err = MPI_Comm_set_attr(dup_comm_world, key_1, (void *) (MPI_Aint) (2 * world_rank)); if (err == MPI_SUCCESS) { errs++; printf("delete function return code was MPI_SUCCESS in put\n"); } /* Because the attribute delete function should fail, the attribute * should *not be removed* */ err = MPI_Comm_delete_attr(dup_comm_world, key_1); if (err == MPI_SUCCESS) { errs++; printf("delete function return code was MPI_SUCCESS in delete\n"); } err = MPI_Comm_dup(dup_comm_world, &d2); if (err == MPI_SUCCESS) { errs++; printf("copy function return code was MPI_SUCCESS in dup\n"); } if (err != MPI_ERR_OTHER) { int lerrclass; MPI_Error_class(err, &lerrclass); if (lerrclass != MPI_ERR_OTHER) { errs++; printf("dup did not return an error code of class ERR_OTHER; "); printf("err = %d, class = %d\n", err, lerrclass); } } #ifndef USE_STRICT_MPI /* Another interpretation is to leave d2 unchanged on error */ if (err && d2 != MPI_COMM_NULL) { errs++; printf("dup did not return MPI_COMM_NULL on error\n"); } #endif delete_flag = 1; MPI_Comm_free(&dup_comm_world); MPI_Comm_free_keyval(&key_1); return errs; }
int main(int argc, char *argv[]) { int errs = 0; int attrval; int i, key[32], keyval, saveKeyval; MPI_Comm comm, dupcomm; MTest_Init(&argc, &argv); while (MTestGetIntracomm(&comm, 1)) { if (comm == MPI_COMM_NULL) continue; MPI_Comm_create_keyval(copy_fn, delete_fn, &keyval, (void *) 0); saveKeyval = keyval; /* in case we need to free explicitly */ attrval = 1; MPI_Comm_set_attr(comm, keyval, (void *) &attrval); /* See MPI-1, 5.7.1. Freeing the keyval does not remove it if it * is in use in an attribute */ MPI_Comm_free_keyval(&keyval); /* We create some dummy keyvals here in case the same keyval * is reused */ for (i = 0; i < 32; i++) { MPI_Comm_create_keyval(MPI_NULL_COPY_FN, MPI_NULL_DELETE_FN, &key[i], (void *) 0); } MPI_Comm_dup(comm, &dupcomm); /* Check that the attribute was copied */ if (attrval != 2) { errs++; printf("Attribute not incremented when comm dup'ed (%s)\n", MTestGetIntracommName()); } MPI_Comm_free(&dupcomm); if (attrval != 1) { errs++; printf("Attribute not decremented when dupcomm %s freed\n", MTestGetIntracommName()); } /* Check that the attribute was freed in the dupcomm */ if (comm != MPI_COMM_WORLD && comm != MPI_COMM_SELF) { MPI_Comm_free(&comm); /* Check that the original attribute was freed */ if (attrval != 0) { errs++; printf("Attribute not decremented when comm %s freed\n", MTestGetIntracommName()); } } else { /* Explicitly delete the attributes from world and self */ MPI_Comm_delete_attr(comm, saveKeyval); } /* Free those other keyvals */ for (i = 0; i < 32; i++) { MPI_Comm_free_keyval(&key[i]); } } MTest_Finalize(errs); MPI_Finalize(); /* The attributes on comm self and world were deleted by finalize * (see separate test) */ return 0; }