static int ckpt_restart(void) { int mpi_errno = MPI_SUCCESS; char *publish_bc_orig = NULL; char *bc_val = NULL; int val_max_sz; int i; MPIDI_STATE_DECL(MPID_STATE_CKPT_RESTART); MPIDI_FUNC_ENTER(MPID_STATE_CKPT_RESTART); /* First, clean up. We didn't shut anything down before the checkpoint, so we need to go close and free any resources */ mpi_errno = MPID_nem_tcp_ckpt_cleanup(); if (mpi_errno) MPIR_ERR_POP(mpi_errno); mpi_errno = MPID_nem_tcp_send_finalize(); if (mpi_errno) MPIR_ERR_POP(mpi_errno); mpi_errno = MPID_nem_tcp_sm_finalize(); if (mpi_errno) MPIR_ERR_POP(mpi_errno); /* Initialize the new business card */ mpi_errno = MPIDI_CH3I_BCInit(&bc_val, &val_max_sz); if (mpi_errno) MPIR_ERR_POP(mpi_errno); publish_bc_orig = bc_val; /* Now we can restart */ mpi_errno = MPID_nem_tcp_init(MPIDI_Process.my_pg, MPIDI_Process.my_pg_rank, &bc_val, &val_max_sz); if (mpi_errno) MPIR_ERR_POP(mpi_errno); /* publish business card */ mpi_errno = MPIDI_PG_SetConnInfo(MPIDI_Process.my_pg_rank, (const char *)publish_bc_orig); if (mpi_errno) MPIR_ERR_POP(mpi_errno); MPIU_Free(publish_bc_orig); for (i = 0; i < MPIDI_Process.my_pg->size; ++i) { MPIDI_VC_t *vc; MPIDI_CH3I_VC *vc_ch; if (i == MPIDI_Process.my_pg_rank) continue; MPIDI_PG_Get_vc(MPIDI_Process.my_pg, i, &vc); vc_ch = &vc->ch; if (!vc_ch->is_local) { mpi_errno = vc_ch->ckpt_restart_vc(vc); if (mpi_errno) MPIR_ERR_POP(mpi_errno); } } fn_exit: MPIDI_FUNC_EXIT(MPID_STATE_CKPT_RESTART); return mpi_errno; fn_fail: goto fn_exit; }
int MPIDI_CH3_Init(int has_parent, MPIDI_PG_t * pg_p, int pg_rank ) { int mpi_errno = MPI_SUCCESS; char *publish_bc_orig = NULL; char *bc_val = NULL; int val_max_remaining; MPIDI_STATE_DECL(MPID_STATE_MPID_CH3_INIT); MPIDI_FUNC_ENTER(MPID_STATE_MPID_CH3_INIT); mpi_errno = MPIDI_CH3I_Progress_init(); if (mpi_errno != MPI_SUCCESS) MPIR_ERR_POP(mpi_errno); /* Initialize the business card */ mpi_errno = MPIDI_CH3I_BCInit( &bc_val, &val_max_remaining ); if (mpi_errno) MPIR_ERR_POP(mpi_errno); publish_bc_orig = bc_val; /* initialize aspects specific to sockets */ mpi_errno = MPIDI_CH3U_Init_sock(has_parent, pg_p, pg_rank, &bc_val, &val_max_remaining); /* Set the connection information in our process group (publish the business card ) */ MPIDI_PG_SetConnInfo( pg_rank, (const char *)publish_bc_orig ); /* Free the business card now that it is published (note that publish_bc_orig is the head of bc_val ) */ MPIDI_CH3I_BCFree( publish_bc_orig ); if (mpi_errno) MPIR_ERR_POP(mpi_errno); fn_exit: MPIDI_FUNC_EXIT(MPID_STATE_MPID_CH3_INIT); return mpi_errno; fn_fail: if (publish_bc_orig != NULL) { MPL_free(publish_bc_orig); } goto fn_exit; }