#include <stdio.h>
#include "mpi.h"
#include "nxtval.h"

void MPE_Counter_create(MPI_Comm old_comm, MPI_Comm *smaller_comm,
			MPI_Comm *counter_comm)
{
  int counter = 0;
  int message, done = 0, myid, numprocs, server, color;
  MPI_Status status;

  MPI_Comm_size(old_comm, &numprocs);
  MPI_Comm_rank(old_comm, &myid);
  server = numprocs-1;     /*   last proc is server */
  MPI_Comm_dup(old_comm, counter_comm); /* make one new comm */
  if (myid == server) color = MPI_UNDEFINED;
  else color = 0;
  MPI_Comm_split(old_comm, color, myid, smaller_comm);

  if (myid == server) {       /* I am the server */
    while (!done) {
        MPI_Recv(&message, 1, MPI_INT, MPI_ANY_SOURCE,
                 MPI_ANY_TAG, *counter_comm, &status);
        if (status.MPI_TAG == REQUEST) {
            MPI_Send(&counter, 1, MPI_INT, status.MPI_SOURCE,
                     VALUE, *counter_comm);
            counter++;
        }
        else if (status.MPI_TAG == GOAWAY) {
            done = 1;
        }
        else {
            fprintf(stderr, "bad tag %d sent to MPE counter\n",
                    status.MPI_TAG);
    		MPI_Abort(*counter_comm, 1);
    	    }
    }
    MPE_Counter_free(smaller_comm, counter_comm);
  }
}