Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Fix dist
[simgrid.git] / teshsuite / smpi / mpich3-test / pt2pt / cancelanysrc.c
1 /* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */
2 /*
3  *  (C) 2014 by Argonne National Laboratory.
4  *      See COPYRIGHT in top-level directory.
5  */
6 #include <stdio.h>
7 #include <stdlib.h>
8 #include <assert.h>
9 #include "mpi.h"
10
11 int main(int argc, char **argv)
12 {
13     int size, rank, msg, cancelled;
14     MPI_Request request;
15     MPI_Status status;
16
17     MPI_Init(&argc, &argv);
18     MPI_Comm_size(MPI_COMM_WORLD, &size);
19     MPI_Comm_rank(MPI_COMM_WORLD, &rank);
20
21     if (size != 2) {
22         fprintf(stderr, "ERROR: must be run with 2 processes");
23         MPI_Abort(MPI_COMM_WORLD, 1);
24     }
25
26     if (rank == 0) {
27         msg = -1;
28         /* Post, then cancel MPI_ANY_SOURCE recv */
29         MPI_Irecv(&msg, 1, MPI_INT, MPI_ANY_SOURCE, 0, MPI_COMM_WORLD, &request);
30         MPI_Cancel(&request);
31         MPI_Wait(&request, &status);
32         MPI_Test_cancelled(&status, &cancelled);
33         assert(cancelled);
34
35         MPI_Barrier(MPI_COMM_WORLD);
36         MPI_Irecv(&msg, 1, MPI_INT, MPI_ANY_SOURCE, 0, MPI_COMM_WORLD, &request);
37         MPI_Wait(&request, &status);
38         assert(msg == 42);
39     }
40     else {
41         MPI_Barrier(MPI_COMM_WORLD);
42         msg = 42;
43         MPI_Send(&msg, 1, MPI_INT, 0, 0, MPI_COMM_WORLD);
44     }
45
46     if (rank == 0)
47         printf(" No Errors\n");
48
49     MPI_Finalize();
50     return 0;
51 }