⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ch3_progress_sock.c

📁 mpi并行计算的c++代码 可用vc或gcc编译通过 可以用来搭建并行计算试验环境
💻 C
📖 第 1 页 / 共 2 页
字号:
			    MPIDI_Pkt_init(&conn->pkt, MPIDI_CH3I_PKT_SC_OPEN_RESP);			    conn->pkt.sc_open_resp.ack = FALSE;			}		    }		}                    		conn->state = CONN_STATE_OPEN_LSEND;		mpi_errno = connection_post_send_pkt(conn);		/* --BEGIN ERROR HANDLING-- */		if (mpi_errno != MPI_SUCCESS)		{		    mpi_errno = MPIR_Err_create_code(mpi_errno, MPIR_ERR_FATAL, FCNAME, __LINE__, MPI_ERR_INTERN,						     "**ch3|sock|open_lrecv_data", NULL);		    goto fn_exit;		}		/* --END ERROR HANDLING-- */	    }	    else /* Handling some internal connection establishment or tear down packet */	    { 		if (conn->pkt.type == MPIDI_CH3I_PKT_SC_OPEN_REQ)		{		    conn->state = CONN_STATE_OPEN_LRECV_DATA;		    mpi_errno = MPIDU_Sock_post_read(conn->sock, conn->pg_id, conn->pkt.sc_open_req.pg_id_len, 						     conn->pkt.sc_open_req.pg_id_len, NULL);   		    /* --BEGIN ERROR HANDLING-- */		    if (mpi_errno != MPI_SUCCESS)		    {			mpi_errno = MPIR_Err_create_code(mpi_errno, MPIR_ERR_FATAL, FCNAME, __LINE__, MPI_ERR_OTHER,							 "**fail", NULL);			goto fn_exit;		    }		    /* --END ERROR HANDLING-- */		}		else if (conn->pkt.type == MPIDI_CH3I_PKT_SC_CONN_ACCEPT)		{		    MPIDI_VC_t *vc; 		    vc = (MPIDI_VC_t *) MPIU_Malloc(sizeof(MPIDI_VC_t));		    /* --BEGIN ERROR HANDLING-- */		    if (vc == NULL)		    {			mpi_errno = MPIR_Err_create_code(MPI_SUCCESS, MPIR_ERR_FATAL, FCNAME, __LINE__, MPI_ERR_OTHER,							 "**nomem", NULL);			goto fn_exit;		    }		    /* --END ERROR HANDLING-- */		    /* FIXME - where does this vc get freed? */		    /* Initialize the device fields */		    MPIDI_VC_Init(vc, NULL, 0);		    /* Initialize the sock fields */		    vc->ch.sendq_head = NULL;		    vc->ch.sendq_tail = NULL;		    vc->ch.state = MPIDI_CH3I_VC_STATE_CONNECTING;		    vc->ch.sock = conn->sock;		    vc->ch.conn = conn;		    conn->vc = vc;		    /* Initialize the shm fields */		    vc->ch.recv_active = NULL;		    vc->ch.send_active = NULL;		    vc->ch.req = NULL;		    vc->ch.read_shmq = NULL;		    vc->ch.write_shmq = NULL;		    vc->ch.shm = NULL;		    vc->ch.shm_state = 0;		    vc->ch.shm_next_reader = NULL;		    vc->ch.shm_next_writer = NULL;		    vc->ch.bShm = FALSE;		    vc->ch.shm_read_connected = 0;		    vc->ch.port_name_tag = conn->pkt.sc_conn_accept.port_name_tag;                    		    MPIDI_Pkt_init(&conn->pkt, MPIDI_CH3I_PKT_SC_OPEN_RESP);		    conn->pkt.sc_open_resp.ack = TRUE;                        		    conn->state = CONN_STATE_OPEN_LSEND;		    mpi_errno = connection_post_send_pkt(conn);		    /* --BEGIN ERROR HANDLING-- */		    if (mpi_errno != MPI_SUCCESS)		    {			mpi_errno = MPIR_Err_create_code(mpi_errno, MPIR_ERR_FATAL, FCNAME, __LINE__, MPI_ERR_INTERN,							 "**ch3|sock|scconnaccept", NULL);			goto fn_exit;		    }		    /* --END ERROR HANDLING-- */		    /* ENQUEUE vc */		    MPIDI_CH3I_Acceptq_enqueue(vc);		}		else if (conn->pkt.type == MPIDI_CH3I_PKT_SC_OPEN_RESP)		{		    if (conn->pkt.sc_open_resp.ack)		    {			conn->state = CONN_STATE_CONNECTED;			conn->vc->ch.state = MPIDI_CH3I_VC_STATE_CONNECTED;			MPIU_Assert(conn->vc->ch.conn == conn);			MPIU_Assert(conn->vc->ch.sock == conn->sock);			    			mpi_errno = connection_post_recv_pkt(conn);			/* --BEGIN ERROR HANDLING-- */			if (mpi_errno != MPI_SUCCESS)			{			    mpi_errno = MPIR_Err_create_code(mpi_errno, MPIR_ERR_FATAL, FCNAME, __LINE__, MPI_ERR_INTERN,							     "**fail", NULL);			    goto fn_exit;			}			/* --END ERROR HANDLING-- */			mpi_errno = connection_post_sendq_req(conn);			/* --BEGIN ERROR HANDLING-- */			if (mpi_errno != MPI_SUCCESS)			{			    mpi_errno = MPIR_Err_create_code(mpi_errno, MPIR_ERR_FATAL, FCNAME, __LINE__, MPI_ERR_INTERN,							     "**ch3|sock|scopenresp", NULL);			    goto fn_exit;			}			/* --END ERROR HANDLING-- */		    }		    else		    {			conn->vc = NULL;			conn->state = CONN_STATE_CLOSING;			MPIDU_Sock_post_close(conn->sock);		    }		}		/* --BEGIN ERROR HANDLING-- */		else		{		    MPIDI_DBG_Print_packet(&conn->pkt);		    mpi_errno = MPIR_Err_create_code(MPI_SUCCESS, MPIR_ERR_FATAL, FCNAME, __LINE__, MPI_ERR_INTERN,						     "**ch3|sock|badpacket", "**ch3|sock|badpacket %d", conn->pkt.type);		    goto fn_exit;		}		/* --END ERROR HANDLING-- */	    }	    break;	}	    	case MPIDU_SOCK_OP_WRITE:	{	    MPIDI_CH3I_Connection_t * conn = (MPIDI_CH3I_Connection_t *) event->user_ptr;	    /* --BEGIN ERROR HANDLING-- */	    if (event->error != MPI_SUCCESS)	    {		mpi_errno = MPIR_Err_create_code(event->error, MPIR_ERR_FATAL, FCNAME, __LINE__, MPI_ERR_OTHER, "**fail", NULL);		goto fn_exit;	    }	    /* --END ERROR HANDLING-- */			    if (conn->send_active)	    {		MPID_Request * sreq = conn->send_active;		mpi_errno = MPIDI_CH3U_Handle_send_req(conn->vc, sreq, &complete);		/* --BEGIN ERROR HANDLING-- */		if (mpi_errno != MPI_SUCCESS)		{		    mpi_errno = MPIR_Err_create_code(mpi_errno, MPIR_ERR_FATAL, FCNAME, __LINE__, MPI_ERR_OTHER,						     "**fail", NULL);		    goto fn_exit;		}		/* --END ERROR HANDLING-- */		if (complete)		{		    MPIDI_CH3I_SendQ_dequeue(conn->vc);		    mpi_errno = connection_post_sendq_req(conn);		    /* --BEGIN ERROR HANDLING-- */		    if (mpi_errno != MPI_SUCCESS)		    {			mpi_errno = MPIR_Err_create_code(mpi_errno, MPIR_ERR_FATAL, FCNAME, __LINE__, MPI_ERR_INTERN,							 "**fail", NULL);			goto fn_exit;		    }		    /* --END ERROR HANDLING-- */		}		else /* more data to send */		{		    for(;;)		    {			MPID_IOV * iovp;			MPIU_Size_t nb;							iovp = sreq->dev.iov;			    			mpi_errno = MPIDU_Sock_writev(conn->sock, iovp, sreq->dev.iov_count, &nb);			/* --BEGIN ERROR HANDLING-- */			if (mpi_errno != MPI_SUCCESS)			{			    mpi_errno = MPIR_Err_create_code(mpi_errno, MPIR_ERR_FATAL, FCNAME, __LINE__, MPI_ERR_OTHER,							     "**ch3|sock|immedwrite", "ch3|sock|immedwrite %p %p %p",							     sreq, conn, conn->vc);			    goto fn_exit;			}			/* --END ERROR HANDLING-- */			MPIDI_DBG_PRINTF((55, FCNAME, "immediate writev, vc=0x%p, sreq=0x%08x, nb=%d",					  conn->vc, sreq->handle, nb));			if (nb > 0 && adjust_iov(&iovp, &sreq->dev.iov_count, nb))			{			    mpi_errno = MPIDI_CH3U_Handle_send_req(conn->vc, sreq, &complete);			    /* --BEGIN ERROR HANDLING-- */			    if (mpi_errno != MPI_SUCCESS)			    {				mpi_errno = MPIR_Err_create_code(				    mpi_errno, MPIR_ERR_FATAL, FCNAME, __LINE__, MPI_ERR_OTHER, "**fail", NULL);				goto fn_exit;			    }			    /* --END ERROR HANDLING-- */			    if (complete)			    {				MPIDI_CH3I_SendQ_dequeue(conn->vc);				mpi_errno = connection_post_sendq_req(conn);				/* --BEGIN ERROR HANDLING-- */				if (mpi_errno != MPI_SUCCESS)				{				    mpi_errno = MPIR_Err_create_code(					mpi_errno, MPIR_ERR_FATAL, FCNAME, __LINE__, MPI_ERR_INTERN, "**fail", NULL);				    goto fn_exit;				}				/* --END ERROR HANDLING-- */				break;			    }			}			else			{			    MPIDI_DBG_PRINTF((55, FCNAME, "posting writev, vc=0x%p, sreq=0x%08x", conn->vc, sreq->handle));			    mpi_errno = MPIDU_Sock_post_writev(conn->sock, iovp, sreq->dev.iov_count, NULL);			    /* --BEGIN ERROR HANDLING-- */			    if (mpi_errno != MPI_SUCCESS)			    {				mpi_errno = MPIR_Err_create_code(				    mpi_errno, MPIR_ERR_FATAL, FCNAME, __LINE__, MPI_ERR_OTHER, "**ch3|sock|postwrite",				    "ch3|sock|postwrite %p %p %p", sreq, conn, conn->vc);				goto fn_exit;			    }			    /* --END ERROR HANDLING-- */			    break;			}		    }		}	    }	    else /* finished writing internal packet header */	    {		if (conn->state == CONN_STATE_OPEN_CSEND)		{		    /* finished sending open request packet */		    /* post receive for open response packet */		    conn->state = CONN_STATE_OPEN_CRECV;		    mpi_errno = connection_post_recv_pkt(conn);		    /* --BEGIN ERROR HANDLING-- */		    if (mpi_errno != MPI_SUCCESS)		    {			mpi_errno = MPIR_Err_create_code(mpi_errno, MPIR_ERR_FATAL, FCNAME, __LINE__, MPI_ERR_INTERN,							 "**fail", NULL);			goto fn_exit;		    }		    /* --END ERROR HANDLING-- */		}		else if (conn->state == CONN_STATE_OPEN_LSEND)		{		    /* finished sending open response packet */		    if (conn->pkt.sc_open_resp.ack == TRUE)		    { 			/* post receive for packet header */			conn->state = CONN_STATE_CONNECTED;			conn->vc->ch.state = MPIDI_CH3I_VC_STATE_CONNECTED;			mpi_errno = connection_post_recv_pkt(conn);			/* --BEGIN ERROR HANDLING-- */			if (mpi_errno != MPI_SUCCESS)			{			    mpi_errno = MPIR_Err_create_code(mpi_errno, MPIR_ERR_FATAL, FCNAME, __LINE__, MPI_ERR_INTERN,							     "**fail", NULL);			    goto fn_exit;			}			/* --END ERROR HANDLING-- */			mpi_errno = connection_post_sendq_req(conn);			/* --BEGIN ERROR HANDLING-- */			if (mpi_errno != MPI_SUCCESS)			{			    mpi_errno = MPIR_Err_create_code(mpi_errno, MPIR_ERR_FATAL, FCNAME, __LINE__, MPI_ERR_INTERN,							     "**ch3|sock|openlsend", NULL);			    goto fn_exit;			}			/* --END ERROR HANDLING-- */		    }		    else		    {			/* head-to-head connections - close this connection */			conn->state = CONN_STATE_CLOSING;			mpi_errno = MPIDU_Sock_post_close(conn->sock);			/* --BEGIN ERROR HANDLING-- */			if (mpi_errno != MPI_SUCCESS)			{			    mpi_errno = MPIR_Err_create_code(mpi_errno, MPIR_ERR_FATAL, FCNAME, __LINE__, MPI_ERR_OTHER,							     "**sock_post_close", NULL);			    goto fn_exit;			}			/* --END ERROR HANDLING-- */		    }		}	    }	    break;	}	case MPIDU_SOCK_OP_ACCEPT:	{	    MPIDI_CH3I_Connection_t * conn;	    mpi_errno = MPIDI_CH3I_Connection_alloc(&conn);	    /* --BEGIN ERROR HANDLING-- */	    if (mpi_errno != MPI_SUCCESS)	    { 		mpi_errno = MPIR_Err_create_code(mpi_errno, MPIR_ERR_RECOVERABLE, FCNAME, __LINE__, MPI_ERR_OTHER,						 "**ch3|sock|accept", NULL);		goto fn_exit;	    }	    /* --END ERROR HANDLING-- */	    mpi_errno = MPIDU_Sock_accept(MPIDI_CH3I_listener_conn->sock, MPIDI_CH3I_sock_set, conn, &conn->sock);	    /* --BEGIN ERROR HANDLING-- */	    if (mpi_errno != MPI_SUCCESS)	    {		mpi_errno = MPIR_Err_create_code(mpi_errno, MPIR_ERR_RECOVERABLE, FCNAME, __LINE__, MPI_ERR_OTHER,						 "**ch3|sock|accept", NULL);		MPIDI_CH3I_Connection_free(conn);		goto fn_exit;	    }	    /* --END ERROR HANDLING-- */	    conn->vc = NULL;	    conn->state = CONN_STATE_OPEN_LRECV_PKT;	    conn->send_active = NULL;	    conn->recv_active = NULL;	    mpi_errno = connection_post_recv_pkt(conn);	    /* --BEGIN ERROR HANDLING-- */	    if (mpi_errno != MPI_SUCCESS)	    {		mpi_errno = MPIR_Err_create_code(mpi_errno, MPIR_ERR_FATAL, FCNAME, __LINE__, MPI_ERR_INTERN,						 "**fail", NULL);		goto fn_exit;	    }	    /* --END ERROR HANDLING-- */	    break;	}	case MPIDU_SOCK_OP_CONNECT:	{	    MPIDI_CH3I_Connection_t * conn = (MPIDI_CH3I_Connection_t *) event->user_ptr;	    /* --BEGIN ERROR HANDLING-- */	    if (event->error != MPI_SUCCESS)	    {		mpi_errno = MPIR_Err_create_code(		    event->error, MPIR_ERR_RECOVERABLE, FCNAME, __LINE__, MPI_ERR_OTHER, "**ch3|sock|connfailed",		    "**ch3|sock|connfailed %s %d", conn->vc->pg->id, conn->vc->pg_rank);		goto fn_exit;	    }	    /* --END ERROR HANDLING-- */	    if (conn->state == CONN_STATE_CONNECTING)	    {		conn->state = CONN_STATE_OPEN_CSEND;		MPIDI_Pkt_init(&conn->pkt, MPIDI_CH3I_PKT_SC_OPEN_REQ);		conn->pkt.sc_open_req.pg_id_len = (int) strlen(MPIDI_Process.my_pg->id) + 1;		conn->pkt.sc_open_req.pg_rank = MPIR_Process.comm_world->rank;		connection_post_send_pkt_and_pgid(conn);	    }	    else	    {		/* CONN_STATE_CONNECT_ACCEPT */                   int port_name_tag;       		conn->state = CONN_STATE_OPEN_CSEND;		/* pkt contains port name tag. In memory debugging mode, MPIDI_Pkt_init resets the packet contents. Therefore,                   save the port name tag and then add it back. */		port_name_tag = conn->pkt.sc_conn_accept.port_name_tag;                		MPIDI_Pkt_init(&conn->pkt, MPIDI_CH3I_PKT_SC_CONN_ACCEPT);		conn->pkt.sc_conn_accept.port_name_tag = port_name_tag;                		mpi_errno = connection_post_send_pkt(conn);		/* --BEGIN ERROR HANDLING-- */		if (mpi_errno != MPI_SUCCESS)		{		    mpi_errno = MPIR_Err_create_code(mpi_errno, MPIR_ERR_FATAL, FCNAME, __LINE__, MPI_ERR_INTERN,						     "**ch3|sock|scconnaccept", NULL);		    goto fn_exit;		}		/* --END ERROR HANDLING-- */	    }	    break;	}	case MPIDU_SOCK_OP_CLOSE:	{	    MPIDI_CH3I_Connection_t * conn = (MPIDI_CH3I_Connection_t *) event->user_ptr;			    /* If the conn pointer is NULL then the close was intentional */	    if (conn != NULL)	    {		if (conn->state == CONN_STATE_CLOSING)		{		    MPIU_Assert(conn->send_active == NULL);		    MPIU_Assert(conn->recv_active == NULL);		    if (conn->vc != NULL)		    {			conn->vc->ch.state = MPIDI_CH3I_VC_STATE_UNCONNECTED;			conn->vc->ch.sock = MPIDU_SOCK_INVALID_SOCK;			MPIDI_CH3U_Handle_connection(conn->vc, MPIDI_VC_EVENT_TERMINATED);		    }		}		else		{		    MPIU_Assert(conn->state == CONN_STATE_LISTENING);		    MPIDI_CH3I_listener_conn = NULL;		    MPIDI_CH3I_listener_port = 0;		    MPIDI_CH3_Progress_signal_completion();		    /* MPIDI_CH3I_progress_completion_count++; */		}		conn->sock = MPIDU_SOCK_INVALID_SOCK;		conn->state = CONN_STATE_CLOSED;		MPIDI_CH3I_Connection_free(conn);	    }	    break;	}	case MPIDU_SOCK_OP_WAKEUP:	{	    MPIDI_CH3_Progress_signal_completion();	    /* MPIDI_CH3I_progress_completion_count++; */	    break;	}    }  fn_exit:    MPIDI_FUNC_EXIT(MPID_STATE_MPIDI_CH3I_PROGRESS_HANDLE_SOCK_EVENT);    return mpi_errno;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -