--- /dev/null
+/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */
+/*
+ *
+ * (C) 2003 by Argonne National Laboratory.
+ * See COPYRIGHT in top-level directory.
+ */
+#include "mpi.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include "mpitest.h"
+
+/*
+ * This check is intended to fail if there is a leak of context ids.
+ * Because this is trying to exhaust the number of context ids, it needs
+ * to run for a longer time than many tests. The for loop uses 100,000
+ * iterations, which is adequate for MPICH (with only about 1k context ids
+ * available).
+ */
+
+int main(int argc, char** argv) {
+
+ int i=0;
+ int randval;
+ int rank;
+ int errs = 0;
+ MPI_Comm newcomm;
+ double startTime;
+ int nLoop = 100000;
+
+ MTest_Init(&argc,&argv);
+
+ for (i=1; i<argc; i++) {
+ if (strcmp( argv[i], "--loopcount" ) == 0) {
+ i++;
+ nLoop = atoi( argv[i] );
+ }
+ else {
+ fprintf( stderr, "Unrecognized argument %s\n", argv[i] );
+ }
+ }
+
+ MPI_Comm_rank(MPI_COMM_WORLD,&rank);
+
+ startTime = MPI_Wtime();
+ for (i=0; i<nLoop; i++) {
+
+ if ( rank == 0 && (i%100 == 0) ) {
+ double rate = MPI_Wtime() - startTime;
+ if (rate > 0) {
+ rate = i / rate;
+ MTestPrintfMsg( 10, "After %d (%f)\n", i, rate );
+ }
+ else {
+ MTestPrintfMsg( 10, "After %d\n", i );
+ }
+ }
+
+ /* FIXME: Explain the rationale behind rand in this test */
+ randval=rand();
+
+ if (randval%(rank+2) == 0) {
+ MPI_Comm_split(MPI_COMM_WORLD,1,rank,&newcomm);
+ MPI_Comm_free( &newcomm );
+ }
+ else {
+ MPI_Comm_split(MPI_COMM_WORLD,MPI_UNDEFINED,rank,&newcomm);
+ if (newcomm != MPI_COMM_NULL) {
+ errs++;
+ printf( "Created a non-null communicator with MPI_UNDEFINED\n" );
+ }
+ }
+
+ }
+
+ MTest_Finalize( errs );
+ MPI_Finalize();
+
+ return 0;
+}