Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
add tests for errhandlers
[simgrid.git] / teshsuite / smpi / mpich3-test / errhan / commcall.c
diff --git a/teshsuite/smpi/mpich3-test/errhan/commcall.c b/teshsuite/smpi/mpich3-test/errhan/commcall.c
new file mode 100644 (file)
index 0000000..28e88ed
--- /dev/null
@@ -0,0 +1,93 @@
+/* -*- 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 "mpitest.h"
+
+/*
+static char MTEST_Descrip[] = "Test comm_call_errhandler";
+*/
+
+static int calls = 0;
+static int errs = 0;
+static MPI_Comm mycomm;
+void eh(MPI_Comm * comm, int *err, ...);
+void eh(MPI_Comm * comm, int *err, ...)
+{
+    if (*err != MPI_ERR_OTHER) {
+        errs++;
+        printf("Unexpected error code\n");
+    }
+    if (*comm != mycomm) {
+        errs++;
+        printf("Unexpected communicator\n");
+    }
+    calls++;
+    return;
+}
+
+int main(int argc, char *argv[])
+{
+    MPI_Comm comm;
+    MPI_Errhandler newerr;
+    int i;
+    int reset_handler;
+
+    MTest_Init(&argc, &argv);
+
+    comm = MPI_COMM_WORLD;
+    mycomm = comm;
+
+    MPI_Comm_create_errhandler(eh, &newerr);
+
+    MPI_Comm_set_errhandler(comm, newerr);
+    MPI_Comm_call_errhandler(comm, MPI_ERR_OTHER);
+    MPI_Errhandler_free(&newerr);
+    if (calls != 1) {
+        errs++;
+        printf("Error handler not called\n");
+    }
+
+    /* Here we apply the test to many copies of a communicator */
+    for (reset_handler = 0; reset_handler <= 1; ++reset_handler) {
+        for (i = 0; i < 1000; i++) {
+            MPI_Comm comm2;
+            calls = 0;
+            MPI_Comm_dup(MPI_COMM_WORLD, &comm);
+            mycomm = comm;
+            MPI_Comm_create_errhandler(eh, &newerr);
+
+            MPI_Comm_set_errhandler(comm, newerr);
+            MPI_Comm_call_errhandler(comm, MPI_ERR_OTHER);
+            if (calls != 1) {
+                errs++;
+                printf("Error handler not called\n");
+            }
+            MPI_Comm_dup(comm, &comm2);
+            calls = 0;
+            mycomm = comm2;
+            /* comm2 must inherit the error handler from comm */
+            MPI_Comm_call_errhandler(comm2, MPI_ERR_OTHER);
+            if (calls != 1) {
+                errs++;
+                printf("Error handler not called\n");
+            }
+
+            if (reset_handler) {
+                /* extra checking of the reference count handling */
+                MPI_Comm_set_errhandler(comm, MPI_ERRORS_ARE_FATAL);
+            }
+            MPI_Errhandler_free(&newerr);
+
+            MPI_Comm_free(&comm);
+            MPI_Comm_free(&comm2);
+        }
+    }
+
+    MTest_Finalize(errs);
+    return MTestReturnValue(errs);
+}