#include<civlc.cvh>
#include <mpi.h>
#include <stdio.h>
#define TAG 0

int main(int argc, char* argv[]) {
  int size, rank;
  _Bool tStart = $false;
  $proc threads[2];

  MPI_Init(&argc, &argv);
  MPI_Comm_rank(MPI_COMM_WORLD, &rank);
  MPI_Comm_size(MPI_COMM_WORLD, &size);
  
  void Thread(int tid) {
    int x = 2*rank + tid, y;
    
    $when(tStart);
    for (int j=0; j<2; j++) {
      if (rank == 1) {
        for (int i=0; i<2; i++)
          MPI_Send(&x, 1, MPI_INT, 1, TAG, MPI_COMM_WORLD);
        for (int i=0; i<2; i++)
          MPI_Recv(&y, 1, MPI_INT, 1, TAG, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
      } else {
        for (int i=0; i<2; i++)
          MPI_Recv(&y, 1, MPI_INT, 0, TAG, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
        for (int i=0; i<2; i++)
          MPI_Send(&x, 1, MPI_INT, 0, TAG, MPI_COMM_WORLD);
      }
    }
  }
  for(int i=0; i<2; i++)
    threads[i] = $spawn Thread(i);
  tStart = $true;
  for (int i=0; i<2; i++) $wait(threads[i]);
  MPI_Finalize();
  return 0;
}
