📄 sock_immed.i
字号:
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 + -