static int terminate_failed_VCs(MPID_Group *new_failed_group) { #if defined(FINEGRAIN_MPI) return (MPI_SUCCESS); /* FG: Temporary bypass. Uses MPI_Group */ #endif int mpi_errno = MPI_SUCCESS; int i; MPIDI_STATE_DECL(MPID_STATE_TERMINATE_FAILED_VCS); MPIDI_FUNC_ENTER(MPID_STATE_TERMINATE_FAILED_VCS); for (i = 0; i < new_failed_group->size; ++i) { MPIDI_VC_t *vc; /* terminate the VC */ /* FIXME: This won't work for dynamic procs */ MPIDI_PG_Get_vc(MPIDI_Process.my_pg, new_failed_group->lrank_to_lpid[i].lpid, &vc); mpi_errno = MPIDI_CH3_Connection_terminate(vc); if (mpi_errno) MPIR_ERR_POP(mpi_errno); } fn_exit: MPIDI_FUNC_EXIT(MPID_STATE_TERMINATE_FAILED_VCS); return mpi_errno; fn_fail: goto fn_exit; }
int MPIDI_CH3_PktHandler_Close( MPIDI_VC_t *vc, MPIDI_CH3_Pkt_t *pkt, intptr_t *buflen, MPIR_Request **rreqp ) { MPIDI_CH3_Pkt_close_t * close_pkt = &pkt->close; int mpi_errno = MPI_SUCCESS; if (vc->state == MPIDI_VC_STATE_LOCAL_CLOSE) { MPIDI_CH3_Pkt_t upkt; MPIDI_CH3_Pkt_close_t * resp_pkt = &upkt.close; MPIR_Request * resp_sreq; MPIDI_Pkt_init(resp_pkt, MPIDI_CH3_PKT_CLOSE); resp_pkt->ack = TRUE; MPL_DBG_MSG_D(MPIDI_CH3_DBG_DISCONNECT,TYPICAL,"sending close(TRUE) to %d", vc->pg_rank); mpi_errno = MPIDI_CH3_iStartMsg(vc, resp_pkt, sizeof(*resp_pkt), &resp_sreq); MPIR_ERR_CHKANDJUMP(mpi_errno, mpi_errno, MPI_ERR_OTHER, "**ch3|send_close_ack"); if (resp_sreq != NULL) { /* There is still another reference being held by the channel. It will not be released until the pkt is actually sent. */ MPIR_Request_free(resp_sreq); } } if (close_pkt->ack == FALSE) { if (vc->state == MPIDI_VC_STATE_LOCAL_CLOSE) { MPL_DBG_MSG_D(MPIDI_CH3_DBG_DISCONNECT,TYPICAL, "received close(FALSE) from %d, moving to CLOSE_ACKED.", vc->pg_rank); MPIDI_CHANGE_VC_STATE(vc, CLOSE_ACKED); } else /* (vc->state == MPIDI_VC_STATE_ACTIVE) */ { if (vc->state != MPIDI_VC_STATE_ACTIVE) { MPL_DBG_MSG_FMT(MPIDI_CH3_DBG_DISCONNECT, TYPICAL, (MPL_DBG_FDEST, "Unexpected state %s in vc %p (rank=%d) (expecting MPIDI_VC_STATE_ACTIVE)\n", MPIDI_VC_GetStateString(vc->state), vc, vc->pg_rank )); MPL_DBG_MSG_D(MPIDI_CH3_DBG_DISCONNECT,TYPICAL, "received close(FALSE) from %d, moving to REMOTE_CLOSE.", vc->pg_rank); } MPIR_Assert(vc->state == MPIDI_VC_STATE_ACTIVE); MPIDI_CHANGE_VC_STATE(vc, REMOTE_CLOSE); } } else /* (close_pkt->ack == TRUE) */ { MPL_DBG_MSG_D(MPIDI_CH3_DBG_DISCONNECT,TYPICAL, "received close(TRUE) from %d, moving to CLOSED.", vc->pg_rank); MPIR_Assert (vc->state == MPIDI_VC_STATE_LOCAL_CLOSE || vc->state == MPIDI_VC_STATE_CLOSE_ACKED); MPIDI_CHANGE_VC_STATE(vc, CLOSED); /* For example, with sockets, Connection_terminate will close the socket */ mpi_errno = MPIDI_CH3_Connection_terminate(vc); } *buflen = sizeof(MPIDI_CH3_Pkt_t); *rreqp = NULL; fn_fail: return mpi_errno; }