Hi Pavan,

 

Here is my code for thread2 :

 

do {

    MPI_Comm newComm ;

    MPI_Comm_accept (m_serverPort.c_str(), MPI_INFO_NULL, 0, MPI_COMM_SELF, &newComm);

    Log ("Accepted a connection");

    int buf = 0 ;

    MPI_Status status ;

    MPI_Recv(&buf, 1, MPI_INT, MPI_ANY_SOURCE, MPI_ANY_TAG, newComm, &status);

 

    if (status.MPI_TAG == MPI_MSG_TAG_NEW_CONN) {

      m_clientComs[m_clientCount] = newComm ;

      m_clientCount++;

    } else if (status.MPI_TAG == MPI_MSG_TAG_SHUTDOWN) {

      Log ("Shutdown");

      //MPI_Comm_disconnect (&newComm);

     Log ("Disconnect");

      break;

    } else {

      Log ("Unmatched Receive");

    }  

  } while(1) ;

 

 

Here is my code for thread1 to terminate thread2 :

 

  MPI_Comm newComm ;

  MPI_Comm_connect (m_serverPort.c_str(), MPI_INFO_NULL, 0, MPI_COMM_SELF, &newComm);

  Log ("Connect to Self");

  int val = 0 ;

  MPI_Request req ;

  MPI_Send(&val, 1, MPI_INT, 0, MPI_MSG_TAG_SHUTDOWN, newComm);

  Log ("Successful");

  //MPI_Status stat ;

  //MPI_Wait(&req, &stat);

  Log ("Complete");

 

  //MPI_Comm_disconnect(&newComm);

 

 

 

 

The MPI_Send/Recv waits.

I am using sock channel.

For nemesis, I get the following crash :  

Assertion failed in file ./src/mpid/ch3/channels/nemesis/include/mpid_nem_inline.h at line 58: vc_ch->is_local

internal ABORT - process 0

 

I tried non-blocking send and receive followed by wait. However, that also does not solve the problem.

 

Thanks,

Hirak

 

 

 

-----

 

Hirak,

 

Your approach should work fine.  I’m not sure what issue you are facing.  I assume thread 1 is doing this:

 

while (1) {

        MPI_Comm_accept(..);

        MPI_Recv(.., tag, ..);

        if (tag == REGULAR_CONNECTION)

               continue;

        else if (tag == TERMINATION) {

               MPI_Send(..);

               break;

        }

}

 

In this case, all clients do an MPI_Comm_connect and then send a message with tag = REGULAR_CONNECTION.  When thread 2 is done with its work, it’ll do an MPI_Comm_connect and then send a message with tag = TERMINATION, wait for a response from thread 1, and call finalize.

 

  — Pavan