📄 sock_post.i
字号:
{ mpi_errno = MPIR_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE, FCNAME, __LINE__, MPIDU_SOCK_ERR_FAIL, "**sock|poll|bind", "**sock|poll|bind %d %d %s", *port, errno, MPIU_Strerror(errno)); goto fn_fail; } /* --END ERROR HANDLING-- */ /* * Set and verify the socket buffer size */ mpi_errno = MPIDU_Sock_SetSockBufferSize( fd, 1 ); if (mpi_errno) { MPIU_ERR_POP( mpi_errno ); } /* * Start listening for incoming connections... */ rc = listen(fd, SOMAXCONN); /* --BEGIN ERROR HANDLING-- */ if (rc == -1) { mpi_errno = MPIR_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE, FCNAME, __LINE__, MPIDU_SOCK_ERR_FAIL, "**sock|poll|listen", "**sock|poll|listen %d %s", errno, MPIU_Strerror(errno)); goto fn_fail; } /* --END ERROR HANDLING-- */ /* * Get listener port. Techincally we don't need to do this if a port was * specified by the calling routine; but it adds an extra error check. */ addr_len = sizeof(addr); rc = getsockname(fd, (struct sockaddr *) &addr, &addr_len); /* --BEGIN ERROR HANDLING-- */ if (rc == -1) { mpi_errno = MPIR_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE, FCNAME, __LINE__, MPIDU_SOCK_ERR_FAIL, "**sock|getport", "**sock|poll|getport %d %s", errno, MPIU_Strerror(errno)); goto fn_fail; } /* --END ERROR HANDLING-- */ *port = (unsigned int) ntohs(addr.sin_port); /* * Allocate and initialize sock and poll structures. If another thread is * blocking in poll(), that thread must be woke up * long enough to pick up the addition of the listener socket. */ mpi_errno = MPIDU_Socki_sock_alloc(sock_set, &sock); /* --BEGIN ERROR HANDLING-- */ if (mpi_errno != MPI_SUCCESS) { mpi_errno = MPIR_Err_create_code(mpi_errno, MPIR_ERR_RECOVERABLE, FCNAME, __LINE__, MPIDU_SOCK_ERR_NOMEM, "**sock|sockalloc", NULL); goto fn_fail; } /* --END ERROR HANDLING-- */ pollfd = MPIDU_Socki_sock_get_pollfd(sock); pollinfo = MPIDU_Socki_sock_get_pollinfo(sock); pollinfo->fd = fd; pollinfo->user_ptr = user_ptr; pollinfo->type = MPIDU_SOCKI_TYPE_LISTENER; pollinfo->state = MPIDU_SOCKI_STATE_CONNECTED_RO; MPIDU_SOCKI_POLLFD_OP_SET(pollfd, pollinfo, POLLIN); *sockp = sock; fn_exit: MPIDI_FUNC_EXIT(MPID_STATE_MPIDU_SOCK_LISTEN); return mpi_errno; /* --BEGIN ERROR HANDLING-- */ fn_fail: if (fd != -1) { close(fd); } goto fn_exit; /* --END ERROR HANDLING-- */}/* end MPIDU_Sock_listen() *//* FIXME: What does this function do? */#undef FUNCNAME#define FUNCNAME MPIDU_Sock_post_read#undef FCNAME#define FCNAME MPIU_QUOTE(FUNCNAME)int MPIDU_Sock_post_read(struct MPIDU_Sock * sock, void * buf, MPIU_Size_t minlen, MPIU_Size_t maxlen, MPIDU_Sock_progress_update_func_t fn){ struct pollfd * pollfd; struct pollinfo * pollinfo; int mpi_errno = MPI_SUCCESS; MPIDI_STATE_DECL(MPID_STATE_MPIDU_SOCK_POST_READ); MPIDI_FUNC_ENTER(MPID_STATE_MPIDU_SOCK_POST_READ); 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); /* --BEGIN ERROR HANDLING-- */ if (minlen < 1 || minlen > maxlen) { mpi_errno = MPIR_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE, FCNAME, __LINE__, MPIDU_SOCK_ERR_BAD_LEN, "**sock|badlen", "**sock|badlen %d %d %d %d", pollinfo->sock_set->id, pollinfo->sock_id, minlen, maxlen); goto fn_exit; } /* --END ERROR HANDLING-- */ pollinfo->read.buf.ptr = buf; pollinfo->read.buf.min = minlen; pollinfo->read.buf.max = maxlen; pollinfo->read_iov_flag = FALSE; pollinfo->read_nb = 0; pollinfo->read_progress_update_fn = fn; MPIDU_SOCKI_POLLFD_OP_SET(pollfd, pollinfo, POLLIN); fn_exit: MPIDI_FUNC_EXIT(MPID_STATE_MPIDU_SOCK_POST_READ); return mpi_errno;}/* end MPIDU_Sock_post_read() */#undef FUNCNAME#define FUNCNAME MPIDU_Sock_post_readv#undef FCNAME#define FCNAME MPIU_QUOTE(FUNCNAME)int MPIDU_Sock_post_readv(struct MPIDU_Sock * sock, MPID_IOV * iov, int iov_n, MPIDU_Sock_progress_update_func_t fn){ struct pollfd * pollfd; struct pollinfo * pollinfo; int mpi_errno = MPI_SUCCESS; MPIDI_STATE_DECL(MPID_STATE_MPIDU_SOCK_POST_READV); MPIDI_FUNC_ENTER(MPID_STATE_MPIDU_SOCK_POST_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); /* --BEGIN ERROR HANDLING-- */ if (iov_n < 1 || iov_n > MPID_IOV_LIMIT) { mpi_errno = MPIR_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE, FCNAME, __LINE__, MPIDU_SOCK_ERR_BAD_LEN, "**sock|badiovn", "**sock|badiovn %d %d %d", pollinfo->sock_set->id, pollinfo->sock_id, iov_n); goto fn_exit; } /* --END ERROR HANDLING-- */ pollinfo->read.iov.ptr = iov; pollinfo->read.iov.count = iov_n; pollinfo->read.iov.offset = 0; pollinfo->read_iov_flag = TRUE; pollinfo->read_nb = 0; pollinfo->read_progress_update_fn = fn; MPIDU_SOCKI_POLLFD_OP_SET(pollfd, pollinfo, POLLIN); fn_exit: MPIDI_FUNC_EXIT(MPID_STATE_MPIDU_SOCK_POST_READV); return mpi_errno;}/* end MPIDU_Sock_post_readv() */#undef FUNCNAME#define FUNCNAME MPIDU_Sock_post_write#undef FCNAME#define FCNAME MPIU_QUOTE(FUNCNAME)int MPIDU_Sock_post_write(struct MPIDU_Sock * sock, void * buf, MPIU_Size_t minlen, MPIU_Size_t maxlen, MPIDU_Sock_progress_update_func_t fn){ struct pollfd * pollfd; struct pollinfo * pollinfo; int mpi_errno = MPI_SUCCESS; MPIDI_STATE_DECL(MPID_STATE_MPIDU_SOCK_POST_WRITE); MPIDI_FUNC_ENTER(MPID_STATE_MPIDU_SOCK_POST_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_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); /* --BEGIN ERROR HANDLING-- */ if (minlen < 1 || minlen > maxlen) { mpi_errno = MPIR_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE, FCNAME, __LINE__, MPIDU_SOCK_ERR_BAD_LEN, "**sock|badlen", "**sock|badlen %d %d %d %d", pollinfo->sock_set->id, pollinfo->sock_id, minlen, maxlen); goto fn_exit; } /* --END ERROR HANDLING-- */ pollinfo->write.buf.ptr = buf; pollinfo->write.buf.min = minlen; pollinfo->write.buf.max = maxlen; pollinfo->write_iov_flag = FALSE; pollinfo->write_nb = 0; pollinfo->write_progress_update_fn = fn; MPIDU_SOCKI_POLLFD_OP_SET(pollfd, pollinfo, POLLOUT); fn_exit: MPIDI_FUNC_EXIT(MPID_STATE_MPIDU_SOCK_POST_WRITE); return mpi_errno;}/* end MPIDU_Sock_post_write() */#undef FUNCNAME#define FUNCNAME MPIDU_Sock_post_writev#undef FCNAME#define FCNAME MPIU_QUOTE(FUNCNAME)int MPIDU_Sock_post_writev(struct MPIDU_Sock * sock, MPID_IOV * iov, int iov_n, MPIDU_Sock_progress_update_func_t fn){ struct pollfd * pollfd; struct pollinfo * pollinfo; int mpi_errno = MPI_SUCCESS; MPIDI_STATE_DECL(MPID_STATE_MPIDU_SOCK_POST_WRITEV); MPIDI_FUNC_ENTER(MPID_STATE_MPIDU_SOCK_POST_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); /* --BEGIN ERROR HANDLING-- */ if (iov_n < 1 || iov_n > MPID_IOV_LIMIT) { mpi_errno = MPIR_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE, FCNAME, __LINE__, MPIDU_SOCK_ERR_BAD_LEN, "**sock|badiovn", "**sock|badiovn %d %d %d", pollinfo->sock_set->id, pollinfo->sock_id, iov_n); goto fn_exit; } /* --END ERROR HANDLING-- */ pollinfo->write.iov.ptr = iov; pollinfo->write.iov.count = iov_n; pollinfo->write.iov.offset = 0; pollinfo->write_iov_flag = TRUE; pollinfo->write_nb = 0; pollinfo->write_progress_update_fn = fn; MPIDU_SOCKI_POLLFD_OP_SET(pollfd, pollinfo, POLLOUT); fn_exit: MPIDI_FUNC_EXIT(MPID_STATE_MPIDU_SOCK_POST_WRITEV); return mpi_errno;}/* end MPIDU_Sock_post_writev() */#undef FUNCNAME#define FUNCNAME MPIDU_Sock_post_close#undef FCNAME#define FCNAME MPIU_QUOTE(FUNCNAME)int MPIDU_Sock_post_close(struct MPIDU_Sock * sock){ struct pollfd * pollfd; struct pollinfo * pollinfo; int mpi_errno = MPI_SUCCESS; MPIDI_STATE_DECL(MPID_STATE_MPIDU_SOCK_POST_CLOSE); MPIDI_FUNC_ENTER(MPID_STATE_MPIDU_SOCK_POST_CLOSE); 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); /* --BEGIN ERROR HANDLING-- */ if (pollinfo->state == MPIDU_SOCKI_STATE_CLOSING) { mpi_errno = MPIR_Err_create_code( mpi_errno, MPIR_ERR_RECOVERABLE, FCNAME, __LINE__, MPIDU_SOCK_ERR_BAD_SOCK, "**sock|closing_already", "**sock|closing_already %d %d", pollinfo->sock_set->id, pollinfo->sock_id); goto fn_exit; } /* --END ERROR HANDLING-- */ if (pollinfo->type == MPIDU_SOCKI_TYPE_COMMUNICATION) { if (MPIDU_SOCKI_POLLFD_OP_ISSET(pollfd, pollinfo, POLLIN | POLLOUT)) { /* --BEGIN ERROR HANDLING-- */ int event_mpi_errno; event_mpi_errno = MPIR_Err_create_code( MPI_SUCCESS, MPIR_ERR_RECOVERABLE, FCNAME, __LINE__, MPIDU_SOCK_ERR_SOCK_CLOSED, "**sock|close_cancel", "**sock|close_cancel %d %d", pollinfo->sock_set->id, pollinfo->sock_id); if (MPIDU_SOCKI_POLLFD_OP_ISSET(pollfd, pollinfo, POLLIN)) { MPIDU_SOCKI_EVENT_ENQUEUE(pollinfo, MPIDU_SOCK_OP_READ, pollinfo->read_nb, pollinfo->user_ptr, MPI_SUCCESS, mpi_errno, fn_exit); } if (MPIDU_SOCKI_POLLFD_OP_ISSET(pollfd, pollinfo, POLLOUT)) { MPIDU_SOCKI_EVENT_ENQUEUE(pollinfo, MPIDU_SOCK_OP_WRITE, pollinfo->write_nb, pollinfo->user_ptr, MPI_SUCCESS, mpi_errno, fn_exit); } MPIDU_SOCKI_POLLFD_OP_CLEAR(pollfd, pollinfo, POLLIN | POLLOUT); /* --END ERROR HANDLING-- */ } } else /* if (pollinfo->type == MPIDU_SOCKI_TYPE_LISTENER) */ { /* * The event queue may contain an accept event which means that * MPIDU_Sock_accept() may be legally called after * MPIDU_Sock_post_close(). However, MPIDU_Sock_accept() must be * called before the close event is return by * MPIDU_Sock_wait(). */ MPIDU_SOCKI_POLLFD_OP_CLEAR(pollfd, pollinfo, POLLIN); } MPIDU_SOCKI_EVENT_ENQUEUE(pollinfo, MPIDU_SOCK_OP_CLOSE, 0, pollinfo->user_ptr, MPI_SUCCESS, mpi_errno, fn_exit); pollinfo->state = MPIDU_SOCKI_STATE_CLOSING; fn_exit: MPIDI_FUNC_EXIT(MPID_STATE_MPIDU_SOCK_POST_CLOSE); return mpi_errno;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -