#include "mpi.h" 
#include <stdio.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 ); 
    } 
}