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

📄 sock_immed.i

📁 fortran并行计算包
💻 I
📖 第 1 页 / 共 2 页
字号:
	if (disconnected)	{	    if (MPIDU_SOCKI_POLLFD_OP_ISSET(pollfd, pollinfo, POLLOUT))	    { 		/* A write is posted on this connection.  Enqueue an event 		   for the write indicating the connection is closed. */		MPIDU_SOCKI_EVENT_ENQUEUE(pollinfo, MPIDU_SOCK_OP_WRITE, 					pollinfo->write_nb, pollinfo->user_ptr,					mpi_errno, mpi_errno, fn_exit);		MPIDU_SOCKI_POLLFD_OP_CLEAR(pollfd, pollinfo, POLLOUT);	    }	    	    pollinfo->state = MPIDU_SOCKI_STATE_DISCONNECTED;	}    }    /* --END ERROR HANDLING-- */  fn_exit:    MPIDI_FUNC_EXIT(MPID_STATE_MPIDU_SOCK_READ);    return mpi_errno;}/* end MPIDU_Sock_read() */#undef FUNCNAME#define FUNCNAME MPIDU_Sock_readv#undef FCNAME#define FCNAME MPIU_QUOTE(FUNCNAME)int MPIDU_Sock_readv(MPIDU_Sock_t sock, MPID_IOV * iov, int iov_n, 		     MPIU_Size_t * num_read){    struct pollfd * pollfd;    struct pollinfo * pollinfo;    ssize_t nb;    int mpi_errno = MPI_SUCCESS;    MPIDI_STATE_DECL(MPID_STATE_READV);    MPIDI_STATE_DECL(MPID_STATE_MPIDU_SOCK_READV);    MPIDI_FUNC_ENTER(MPID_STATE_MPIDU_SOCK_READV);        MPIDU_SOCKI_VERIFY_INIT(mpi_errno, fn_exit);    MPIDU_SOCKI_VALIDATE_SOCK(sock, mpi_errno, fn_exit);    pollfd = MPIDU_Socki_sock_get_pollfd(sock);    pollinfo = MPIDU_Socki_sock_get_pollinfo(sock);    MPIDU_SOCKI_VALIDATE_FD(pollinfo, mpi_errno, fn_exit);    MPIDU_SOCKI_VERIFY_CONNECTED_READABLE(pollinfo, mpi_errno, fn_exit);    MPIDU_SOCKI_VERIFY_NO_POSTED_READ(pollfd, pollinfo, mpi_errno, fn_exit);    /*     * FIXME: The IEEE 1003.1 standard says that if the sum of the iov_len      * fields exceeds SSIZE_MAX, an errno of EINVAL will be     * returned.  How do we handle this?  Can we place an equivalent      * limitation in the Sock interface?     */    do    {	MPIDI_FUNC_ENTER(MPID_STATE_READV);	nb = readv(pollinfo->fd, iov, iov_n);	MPIDI_FUNC_EXIT(MPID_STATE_READV);    }    while (nb == -1 && errno == EINTR);    if (nb > 0)    {	*num_read = (MPIU_Size_t) nb;    }    /* --BEGIN ERROR HANDLING-- */    else if (nb == 0)    {	*num_read = 0;		mpi_errno = MPIR_Err_create_code(	    MPI_SUCCESS, MPIR_ERR_RECOVERABLE, FCNAME, __LINE__, 	    MPIDU_SOCK_ERR_CONN_CLOSED,	    "**sock|connclosed", "**sock|connclosed %d %d", 	    pollinfo->sock_set->id, pollinfo->sock_id);		if (MPIDU_SOCKI_POLLFD_OP_ISSET(pollfd, pollinfo, POLLOUT))	{ 	    	    /* A write is posted on this connection.  Enqueue an event 	       for the write indicating the connection is closed. */	    MPIDU_SOCKI_EVENT_ENQUEUE(pollinfo, MPIDU_SOCK_OP_WRITE, 				      pollinfo->write_nb, pollinfo->user_ptr,				      mpi_errno, mpi_errno, fn_exit);	    MPIDU_SOCKI_POLLFD_OP_CLEAR(pollfd, pollinfo, POLLOUT);	}		pollinfo->state = MPIDU_SOCKI_STATE_DISCONNECTED;    }    else if (errno == EAGAIN || errno == EWOULDBLOCK)    {	*num_read = 0;    }    else    {	int disconnected;		*num_read = 0;		mpi_errno = MPIDU_Socki_os_to_mpi_errno(pollinfo, errno, FCNAME,						__LINE__, &disconnected);	if (MPIR_Err_is_fatal(mpi_errno))	{	    /*	     * A serious error occurred.  There is no guarantee that the 	     * data structures are still intact.  Therefore, we avoid	     * modifying them.	     */	    goto fn_exit;	}	if (disconnected)	{	    if (MPIDU_SOCKI_POLLFD_OP_ISSET(pollfd, pollinfo, POLLOUT))	    { 		/* A write is posted on this connection.  Enqueue an event 		   for the write indicating the connection is closed. */		MPIDU_SOCKI_EVENT_ENQUEUE(pollinfo, MPIDU_SOCK_OP_WRITE, 					pollinfo->write_nb, pollinfo->user_ptr,					  mpi_errno, mpi_errno, fn_exit);		MPIDU_SOCKI_POLLFD_OP_CLEAR(pollfd, pollinfo, POLLOUT);	    }	    	    pollinfo->state = MPIDU_SOCKI_STATE_DISCONNECTED;	}    }    /* --END ERROR HANDLING-- */  fn_exit:    MPIDI_FUNC_EXIT(MPID_STATE_MPIDU_SOCK_READV);    return mpi_errno;}/* end MPIDU_Sock_readv() */#undef FUNCNAME#define FUNCNAME MPIDU_Sock_write#undef FCNAME#define FCNAME MPIU_QUOTE(FUNCNAME)int MPIDU_Sock_write(MPIDU_Sock_t sock, void * buf, MPIU_Size_t len, 		     MPIU_Size_t * num_written){    struct pollfd * pollfd;    struct pollinfo * pollinfo;    ssize_t nb;    int mpi_errno = MPI_SUCCESS;    MPIDI_STATE_DECL(MPID_STATE_WRITE);    MPIDI_STATE_DECL(MPID_STATE_MPIDU_SOCK_WRITE);    MPIDI_FUNC_ENTER(MPID_STATE_MPIDU_SOCK_WRITE);        MPIDU_SOCKI_VERIFY_INIT(mpi_errno, fn_exit);    MPIDU_SOCKI_VALIDATE_SOCK(sock, mpi_errno, fn_exit);    pollfd = MPIDU_Socki_sock_get_pollfd(sock);    pollinfo = MPIDU_Socki_sock_get_pollinfo(sock);    MPIDU_SOCKI_VERIFY_CONNECTED_WRITABLE(pollinfo, mpi_errno, fn_exit);    MPIDU_SOCKI_VALIDATE_FD(pollinfo, mpi_errno, fn_exit);    MPIDU_SOCKI_VERIFY_NO_POSTED_WRITE(pollfd, pollinfo, mpi_errno, fn_exit);        /* FIXME: multiple passes should be made if len > SSIZE_MAX and nb == SSIZE_MAX */    if (len > SSIZE_MAX)    {	len = SSIZE_MAX;    }        do    {	MPIDI_FUNC_ENTER(MPID_STATE_WRITE);	nb = write(pollinfo->fd, buf, len);	MPIDI_FUNC_EXIT(MPID_STATE_WRITE);    }    while (nb == -1 && errno == EINTR);    if (nb >= 0)    {	*num_written = nb;    }    /* --BEGIN ERROR HANDLING-- */    else if (errno == EAGAIN || errno == EWOULDBLOCK)    {	*num_written = 0;    }    else    {	int disconnected;		*num_written = 0;		mpi_errno = MPIDU_Socki_os_to_mpi_errno(pollinfo, errno, FCNAME, 						__LINE__, &disconnected);	if (MPIR_Err_is_fatal(mpi_errno))	{	    /*	     * A serious error occurred.  There is no guarantee that the data 	     * structures are still intact.  Therefore, we avoid	     * modifying them.	     */	    goto fn_exit;	}	if (disconnected)	{	    /*	     * The connection is dead but data may still be in the socket	     * buffer; thus, we change the state and let	     * MPIDU_Sock_wait() clean things up.	     */	    pollinfo->state = MPIDU_SOCKI_STATE_CONNECTED_RO;	}    }    /* --END ERROR HANDLING-- */  fn_exit:    MPIDI_FUNC_EXIT(MPID_STATE_MPIDU_SOCK_WRITE);    return mpi_errno;}/* end MPIDU_Sock_write() */#undef FUNCNAME#define FUNCNAME MPIDU_Sock_writev#undef FCNAME#define FCNAME MPIU_QUOTE(FUNCNAME)int MPIDU_Sock_writev(MPIDU_Sock_t sock, MPID_IOV * iov, int iov_n, MPIU_Size_t * num_written){    struct pollfd * pollfd;    struct pollinfo * pollinfo;    ssize_t nb;    int mpi_errno = MPI_SUCCESS;    MPIDI_STATE_DECL(MPID_STATE_WRITEV);    MPIDI_STATE_DECL(MPID_STATE_MPIDU_SOCK_WRITEV);    MPIDI_FUNC_ENTER(MPID_STATE_MPIDU_SOCK_WRITEV);        MPIDU_SOCKI_VERIFY_INIT(mpi_errno, fn_exit);    MPIDU_SOCKI_VALIDATE_SOCK(sock, mpi_errno, fn_exit);    pollfd = MPIDU_Socki_sock_get_pollfd(sock);    pollinfo = MPIDU_Socki_sock_get_pollinfo(sock);    MPIDU_SOCKI_VALIDATE_FD(pollinfo, mpi_errno, fn_exit);    MPIDU_SOCKI_VERIFY_CONNECTED_WRITABLE(pollinfo, mpi_errno, fn_exit);    MPIDU_SOCKI_VERIFY_NO_POSTED_WRITE(pollfd, pollinfo, mpi_errno, fn_exit);        /*     * FIXME: The IEEE 1003.1 standard says that if the sum of the iov_len      * fields exceeds SSIZE_MAX, an errno of EINVAL will be     * returned.  How do we handle this?  Can we place an equivalent      * limitation in the Sock interface?     */    do    {	MPIDI_FUNC_ENTER(MPID_STATE_WRITEV);	nb = writev(pollinfo->fd, iov, iov_n);	MPIDI_FUNC_EXIT(MPID_STATE_WRITEV);    }    while (nb == -1 && errno == EINTR);    if (nb >= 0)    {	*num_written = (MPIU_Size_t) nb;    }    /* --BEGIN ERROR HANDLING-- */    else if (errno == EAGAIN || errno == EWOULDBLOCK)    {	*num_written = 0;    }    else    {	int disconnected;		*num_written = 0;		mpi_errno = MPIDU_Socki_os_to_mpi_errno(pollinfo, errno, FCNAME, 						__LINE__, &disconnected);	if (MPIR_Err_is_fatal(mpi_errno))	{	    /*	     * A serious error occurred.  There is no guarantee that the 	     * data structures are still intact.  Therefore, we avoid	     * modifying them.	     */	    goto fn_exit;	}	if (disconnected)	{	    /*	     * The connection is dead but data may still be in the socket 	     * buffer; thus, we change the state and let	     * MPIDU_Sock_wait() clean things up.	     */	    pollinfo->state = MPIDU_SOCKI_STATE_CONNECTED_RO;	}    }    /* --END ERROR HANDLING-- */  fn_exit:    MPIDI_FUNC_EXIT(MPID_STATE_MPIDU_SOCK_WRITEV);    return mpi_errno;}/* end MPIDU_Sock_writev() */#undef FUNCNAME#define FUNCNAME MPIDU_Sock_wakeup#undef FCNAME#define FCNAME MPIU_QUOTE(FUNCNAME)int MPIDU_Sock_wakeup(struct MPIDU_Sock_set * sock_set){    int mpi_errno = MPI_SUCCESS;    MPIDI_STATE_DECL(MPID_STATE_MPIDU_SOCK_WAKEUP);    MPIDI_FUNC_ENTER(MPID_STATE_MPIDU_SOCK_WAKEUP);    MPIDU_SOCKI_VERIFY_INIT(mpi_errno, fn_exit);    MPIDU_SOCKI_VALIDATE_SOCK_SET(sock_set, mpi_errno, fn_exit);    /* FIXME: We need (1) a standardized test for including multithreaded       code and (2) include support for user requests for a lower-level       of thread safety.  Finally, things like this should probably        be implemented as an abstraction (e.g., wakeup_progress_threads?)       rather than this specific code.  */#ifdef MPICH_IS_THREADED    MPIU_THREAD_CHECK_BEGIN    {	struct pollinfo * pollinfo;		pollinfo = MPIDU_Socki_sock_get_pollinfo(sock_set->intr_sock);	MPIDU_SOCKI_EVENT_ENQUEUE(pollinfo, MPIDU_SOCK_OP_WAKEUP, 0, NULL, 				  mpi_errno, mpi_errno, fn_exit);	MPIDU_Socki_wakeup(sock_set);    }    MPIU_THREAD_CHECK_END#   endif#ifdef MPICH_IS_THREADED    fn_exit:#endif    MPIDI_FUNC_EXIT(MPID_STATE_MPIDU_SOCK_WAKEUP);    return mpi_errno;}/* end MPIDU_Sock_wakeup() */

⌨️ 快捷键说明

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