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

📄 socki_util.i

📁 fortran并行计算包
💻 I
📖 第 1 页 / 共 3 页
字号:
/* -*- Mode: C; c-basic-offset:4 ; -*- *//* *  (C) 2001 by Argonne National Laboratory. *      See COPYRIGHT in top-level directory. */#ifdef MPICH_IS_THREADEDstatic int MPIDU_Socki_wakeup(struct MPIDU_Sock_set * sock_set);int MPIDI_Sock_update_sock_set( struct MPIDU_Sock_set *, int );#endifstatic int MPIDU_Socki_os_to_mpi_errno(struct pollinfo * pollinfo, 		     int os_errno, char * fcname, int line, int * conn_failed);static int MPIDU_Socki_adjust_iov(ssize_t nb, MPID_IOV * const iov, 				  const int count, int * const offsetp);static int MPIDU_Socki_sock_alloc(struct MPIDU_Sock_set * sock_set, 				  struct MPIDU_Sock ** sockp);static void MPIDU_Socki_sock_free(struct MPIDU_Sock * sock);static int MPIDU_Socki_event_enqueue(struct pollinfo * pollinfo, 				     enum MPIDU_Sock_op op, 				     MPIU_Size_t num_bytes,				     void * user_ptr, int error);static int inline MPIDU_Socki_event_dequeue(struct MPIDU_Sock_set * sock_set, 					    int * set_elem, 					    struct MPIDU_Sock_event * eventp);static void MPIDU_Socki_free_eventq_mem(void);struct MPIDU_Socki_eventq_table{    struct MPIDU_Socki_eventq_elem elems[MPIDU_SOCK_EVENTQ_POOL_SIZE];    struct MPIDU_Socki_eventq_table * next;};static struct MPIDU_Socki_eventq_table *MPIDU_Socki_eventq_table_head=NULL;#define MPIDU_Socki_sock_get_pollfd(sock_)          (&(sock_)->sock_set->pollfds[(sock_)->elem])#define MPIDU_Socki_sock_get_pollinfo(sock_)        (&(sock_)->sock_set->pollinfos[(sock_)->elem])#define MPIDU_Socki_pollinfo_get_pollfd(pollinfo_) (&(pollinfo_)->sock_set->pollfds[(pollinfo_)->elem])/* Enqueue a new event.  If the enqueue fails, generate an error and jump to    the fail_label_ */#define MPIDU_SOCKI_EVENT_ENQUEUE(pollinfo_, op_, nb_, user_ptr_, event_mpi_errno_, mpi_errno_, fail_label_)	\{									\    mpi_errno_ = MPIDU_Socki_event_enqueue((pollinfo_), (op_), (nb_), (user_ptr_), (event_mpi_errno_));		\    if (mpi_errno_ != MPI_SUCCESS)					\    {									\	mpi_errno_ = MPIR_Err_create_code(mpi_errno, MPIR_ERR_FATAL, FCNAME, __LINE__, MPIDU_SOCK_ERR_FAIL,	\					  "**sock|poll|eqfail", "**sock|poll|eqfail %d %d %d",			\					  pollinfo->sock_set->id, pollinfo->sock_id, (op_));			\	goto fail_label_;						\    }									\}/* FIXME: These need to separate the operations from the thread-related   synchronization to ensure that the code that is independent of    threads is always the same.  Also, the thread-level check needs    to be identical to all others, and there should be an option,   possibly embedded within special thread macros, to allow   runtime control of the thread level */#ifndef MPICH_IS_THREADED#   define MPIDU_SOCKI_POLLFD_OP_SET(pollfd_, pollinfo_, op_)	\    {								\        (pollfd_)->events |= (op_);				\        (pollfd_)->fd = (pollinfo_)->fd;			\    }#   define MPIDU_SOCKI_POLLFD_OP_CLEAR(pollfd_, pollinfo_, op_)	\    {								\        (pollfd_)->events &= ~(op_);				\        (pollfd_)->revents &= ~(op_);				\        if (((pollfd_)->events & (POLLIN | POLLOUT)) == 0)	\        {							\            (pollfd_)->fd = -1;					\        }							\    }#else /* MPICH_IS_THREADED *//* FIXME: Does this need a runtime check on whether threads are in use? */#   define MPIDU_SOCKI_POLLFD_OP_SET(pollfd_, pollinfo_, op_)		\    {									\	(pollinfo_)->pollfd_events |= (op_);				\	if ((pollinfo_)->sock_set->pollfds_active == NULL)		\	{								\	    (pollfd_)->events |= (op_);					\	    (pollfd_)->fd = (pollinfo_)->fd;				\	}								\	else								\	{								\	    (pollinfo_)->sock_set->pollfds_updated = TRUE;		\	    MPIDU_Socki_wakeup((pollinfo_)->sock_set);			\	}								\    }#   define MPIDU_SOCKI_POLLFD_OP_CLEAR(pollfd_, pollinfo_, op_)		\    {									\	(pollinfo_)->pollfd_events &= ~(op_);				\	if ((pollinfo_)->sock_set->pollfds_active == NULL)		\	{								\	    (pollfd_)->events &= ~(op_);				\	    (pollfd_)->revents &= ~(op_);				\	    if (((pollfd_)->events & (POLLIN | POLLOUT)) == 0)		\	    {								\		(pollfd_)->fd = -1;					\	    }								\	}								\	else								\	{								\	    (pollinfo_)->sock_set->pollfds_updated = TRUE;		\	    MPIDU_Socki_wakeup((pollinfo_)->sock_set);			\	}								\    }#endif#define MPIDU_SOCKI_POLLFD_OP_ISSET(pollfd_, pollinfo_, op_) ((pollfd_)->events & (op_))/* FIXME: Low usage operations like this should be a function for   better readability, modularity, and code size */#define MPIDU_SOCKI_GET_SOCKET_ERROR(pollinfo_, os_errno_, mpi_errno_, fail_label_)				\{								\    int rc__;							\    socklen_t sz__;						\								\    sz__ = sizeof(os_errno_);					\    rc__ = getsockopt((pollinfo_)->fd, SOL_SOCKET, SO_ERROR, &(os_errno_), &sz__);				\    if (rc__ != 0)						\    {								\	if (errno == ENOMEM || errno == ENOBUFS)		\	{							\	    mpi_errno_ = MPIR_Err_create_code(			\		MPI_SUCCESS, MPIR_ERR_RECOVERABLE, FCNAME, __LINE__, MPIDU_SOCK_ERR_NOMEM, "**sock|osnomem",	\		"**sock|osnomem %s %d %d", "getsockopt", pollinfo->sock_set->id, pollinfo->sock_id);		\	}							\	else							\	{							\	    mpi_errno = MPIR_Err_create_code(			\		MPI_SUCCESS, MPIR_ERR_FATAL, FCNAME, __LINE__, MPIDU_SOCK_ERR_FAIL, "**sock|oserror",		\		"**sock|poll|oserror %s %d %d %d %s", "getsockopt", pollinfo->sock_set->id, pollinfo->sock_id,	\		 (os_errno_), MPIU_Strerror(os_errno_));	\	}							\								\        goto fail_label_;					\    }								\}/* * Validation tests *//* FIXME: Are these really optional?  Based on their definitions, it looks   like they should only be used when debugging the code.  */#ifdef USE_SOCK_VERIFY#define MPIDU_SOCKI_VERIFY_INIT(mpi_errno_, fail_label_)		\{								        \    if (MPIDU_Socki_initialized <= 0)					\    {									\	(mpi_errno_) = MPIR_Err_create_code((mpi_errno_), MPIR_ERR_RECOVERABLE, FCNAME, __LINE__, MPIDU_SOCK_ERR_INIT,	\					 "**sock|uninit", NULL);	\	goto fail_label_;						\    }									\}#define MPIDU_SOCKI_VALIDATE_SOCK_SET(sock_set_, mpi_errno_, fail_label_)#define MPIDU_SOCKI_VALIDATE_SOCK(sock_, mpi_errno_, fail_label_)	\{									\    struct pollinfo * pollinfo__;					\									\    if ((sock_) == NULL || (sock_)->sock_set == NULL || (sock_)->elem < 0 ||							\	(sock_)->elem >= (sock_)->sock_set->poll_array_elems)		\    {									\	(mpi_errno_) = MPIR_Err_create_code((mpi_errno_), MPIR_ERR_RECOVERABLE, FCNAME, __LINE__, MPIDU_SOCK_ERR_BAD_SOCK,	\					    "**sock|badsock", NULL);	\	goto fail_label_;						\    }									\									\    pollinfo__ = MPIDU_Socki_sock_get_pollinfo(sock_);			\									\    if (pollinfo__->type <= MPIDU_SOCKI_TYPE_FIRST || pollinfo__->type >= MPIDU_SOCKI_TYPE_INTERRUPTER ||			\	pollinfo__->state <= MPIDU_SOCKI_STATE_FIRST || pollinfo__->state >= MPIDU_SOCKI_STATE_LAST)				\    {									\	(mpi_errno_) = MPIR_Err_create_code((mpi_errno_), MPIR_ERR_RECOVERABLE, FCNAME, __LINE__, MPIDU_SOCK_ERR_BAD_SOCK,	\					    "**sock|badsock", NULL);	\	goto fail_label_;						\    }									\}#define MPIDU_SOCKI_VERIFY_CONNECTED_READABLE(pollinfo_, mpi_errno_, fail_label_)						\{									\    if ((pollinfo_)->type == MPIDU_SOCKI_TYPE_COMMUNICATION)		\    {									\	if ((pollinfo_)->state == MPIDU_SOCKI_STATE_CONNECTING)		\	{								\	    (mpi_errno_) = MPIR_Err_create_code(			\		(mpi_errno_), MPIR_ERR_RECOVERABLE, FCNAME, __LINE__, MPIDU_SOCK_ERR_BAD_SOCK, "**sock|notconnected",		\		"**sock|notconnected %d %d", (pollinfo_)->sock_set->id, (pollinfo_)->sock_id);					\	    goto fail_label_;						\	}								\	else if ((pollinfo_)->state == MPIDU_SOCKI_STATE_DISCONNECTED)	\	{								\	    if ((pollinfo_)->os_errno == 0)				\	    {								\		(mpi_errno_) = MPIR_Err_create_code(			\		    (mpi_errno_), MPIR_ERR_RECOVERABLE, FCNAME, __LINE__, MPIDU_SOCK_ERR_CONN_CLOSED, "**sock|connclosed",	\		    "**sock|connclosed %d %d", (pollinfo_)->sock_set->id, (pollinfo_)->sock_id);				\	    }								\	    else							\	    {								\		(mpi_errno_) = MPIR_Err_create_code(			\		    (mpi_errno_), MPIR_ERR_RECOVERABLE, FCNAME, __LINE__, MPIDU_SOCK_ERR_CONN_FAILED, "**sock|connfailed",	\		    "**sock|poll|connfailed %d %d %d %s", (pollinfo_)->sock_set->id, (pollinfo_)->sock_id,			\		    (pollinfo_)->os_errno, MPIU_Strerror((pollinfo_)->os_errno));						\	    }								\	    goto fail_label_;						\	}								\	else if ((pollinfo_)->state == MPIDU_SOCKI_STATE_CLOSING)	\	{								\	    (mpi_errno_) = MPIR_Err_create_code(			\		(mpi_errno_), MPIR_ERR_RECOVERABLE, FCNAME, __LINE__, MPIDU_SOCK_ERR_INPROGRESS, "**sock|closing",		\		"**sock|closing %d %d", (pollinfo_)->sock_set->id, (pollinfo_)->sock_id);					\									\	    goto fail_label_;						\	}								\	else if ((pollinfo_)->state != MPIDU_SOCKI_STATE_CONNECTED_RW && (pollinfo_)->state != MPIDU_SOCKI_STATE_CONNECTED_RO)	\	{								\	    (mpi_errno_) = MPIR_Err_create_code((mpi_errno_), MPIR_ERR_RECOVERABLE, FCNAME, __LINE__, MPIDU_SOCK_ERR_BAD_SOCK,	\						"**sock|badsock", NULL);							\	    goto fail_label_;						\	}								\    }									\    else if ((pollinfo_)->type == MPIDU_SOCKI_TYPE_LISTENER)		\    {									\	(mpi_errno_) = MPIR_Err_create_code(				\	    (mpi_errno_), MPIR_ERR_RECOVERABLE, FCNAME, __LINE__, MPIDU_SOCK_ERR_BAD_SOCK, "**sock|listener_read",		\	    "**sock|listener_read %d %d", (pollinfo_)->sock_set->id, (pollinfo_)->sock_id);					\									\	goto fail_label_;						\    }									\}#define MPIDU_SOCKI_VERIFY_CONNECTED_WRITABLE(pollinfo_, mpi_errno_, fail_label_)						 \{									\    if ((pollinfo_)->type == MPIDU_SOCKI_TYPE_COMMUNICATION)		\    {									\	if ((pollinfo_)->state == MPIDU_SOCKI_STATE_CONNECTING)		\	{								\	    (mpi_errno_) = MPIR_Err_create_code((mpi_errno_), MPIR_ERR_RECOVERABLE, FCNAME, __LINE__, MPIDU_SOCK_ERR_BAD_SOCK,	 \						"**sock|notconnected", "**sock|notconnected %d %d",				 \						(pollinfo_)->sock_set->id, (pollinfo_)->sock_id);				 \	    goto fail_label_;						\	}								\	else if ((pollinfo_)->state == MPIDU_SOCKI_STATE_DISCONNECTED || (pollinfo_)->state == MPIDU_SOCKI_STATE_CONNECTED_RO)	 \	{								\	    if ((pollinfo_)->os_errno == 0)				\	    {								\		(mpi_errno_) = MPIR_Err_create_code(			\		    (mpi_errno_), MPIR_ERR_RECOVERABLE, FCNAME, __LINE__, MPIDU_SOCK_ERR_CONN_CLOSED, "**sock|connclosed",	 \		    "**sock|connclosed %d %d", (pollinfo_)->sock_set->id, (pollinfo_)->sock_id);				 \	    }								\	    else							\	    {								\		(mpi_errno_) = MPIR_Err_create_code(										 \		    (mpi_errno_), MPIR_ERR_RECOVERABLE, FCNAME, __LINE__, MPIDU_SOCK_ERR_CONN_FAILED, "**sock|connfailed",	 \		    "**sock|poll|connfailed %d %d %d %s", (pollinfo_)->sock_set->id, (pollinfo_)->sock_id,			 \		    (pollinfo_)->os_errno, MPIU_Strerror((pollinfo_)->os_errno));						 \	    }								\	    goto fail_label_;						\	}								\	else if ((pollinfo_)->state == MPIDU_SOCKI_STATE_CLOSING)	\	{								\	    (mpi_errno_) = MPIR_Err_create_code((mpi_errno_), MPIR_ERR_RECOVERABLE, FCNAME, __LINE__, MPIDU_SOCK_ERR_INPROGRESS, \						"**sock|closing", "**sock|closing %d %d",					 \						(pollinfo_)->sock_set->id, (pollinfo_)->sock_id);				 \									\	    goto fail_label_;						\	}								\	else if ((pollinfo_)->state != MPIDU_SOCKI_STATE_CONNECTED_RW)	\	{								\	    (mpi_errno_) = MPIR_Err_create_code((mpi_errno_), MPIR_ERR_RECOVERABLE, FCNAME, __LINE__, MPIDU_SOCK_ERR_BAD_SOCK,	 \						"**sock|badsock", NULL);							 \	    goto fail_label_;						\	}								\    }									\    else if ((pollinfo_)->type == MPIDU_SOCKI_TYPE_LISTENER)		\    {									\	(mpi_errno_) = MPIR_Err_create_code((mpi_errno_), MPIR_ERR_RECOVERABLE, FCNAME, __LINE__, MPIDU_SOCK_ERR_BAD_SOCK,	 \					    "**sock|listener_write", "**sock|listener_write %d %d",				 \					    (pollinfo_)->sock_set->id, (pollinfo_)->sock_id);					 \									\	goto fail_label_;						\    }									\}#define MPIDU_SOCKI_VALIDATE_FD(pollinfo_, mpi_errno_, fail_label_)	\{									\    if ((pollinfo_)->fd < 0)						\    {									\	(mpi_errno_) = MPIR_Err_create_code((mpi_errno_), MPIR_ERR_RECOVERABLE, FCNAME, __LINE__, MPIDU_SOCK_ERR_BAD_SOCK,	\					    "**sock|badhandle", "**sock|poll|badhandle %d %d %d",				\					    (pollinfo_)->sock_set->id, (pollinfo_)->sock_id, (pollinfo_)->fd);			\	goto fail_label_;						\    }									\}#define MPIDU_SOCKI_VERIFY_NO_POSTED_READ(pollfd_, pollinfo_, mpi_errno_, fail_label_)						\{									\    if (MPIDU_SOCKI_POLLFD_OP_ISSET((pollfd_), (pollinfo_), POLLIN))	\    {									\	(mpi_errno_) = MPIR_Err_create_code((mpi_errno_), MPIR_ERR_RECOVERABLE, FCNAME, __LINE__, MPIDU_SOCK_ERR_INPROGRESS,	\					    "**sock|reads", "**sock|reads %d %d",						\					    (pollinfo_)->sock_set->id, (pollinfo_)->sock_id);					\	goto fail_label_;						\    }									\}#define MPIDU_SOCKI_VERIFY_NO_POSTED_WRITE(pollfd_, pollinfo_, mpi_errno_, fail_label_)						\{									\    if (MPIDU_SOCKI_POLLFD_OP_ISSET((pollfd_), (pollinfo_), POLLOUT))	\    {									\	(mpi_errno_) = MPIR_Err_create_code((mpi_errno_), MPIR_ERR_RECOVERABLE, FCNAME, __LINE__, MPIDU_SOCK_ERR_INPROGRESS,	\					    "**sock|writes", "**sock|writes %d %d",						\					    (pollinfo_)->sock_set->id, (pollinfo_)->sock_id);					\	goto fail_label_;						\    }									\}#else/* Use minimal to no checking */#define MPIDU_SOCKI_VERIFY_INIT(mpi_errno_,fail_label_)#define MPIDU_SOCKI_VALIDATE_SOCK_SET(sock_set_,mpi_errno_,fail_label_)#define MPIDU_SOCKI_VALIDATE_SOCK(sock_,mpi_errno_,fail_label_)#define MPIDU_SOCKI_VERIFY_CONNECTED_READABLE(pollinfo_,mpi_errno_,fail_label_)#define MPIDU_SOCKI_VERIFY_CONNECTED_WRITABLE(pollinfo_,mpi_errno_,fail_label_)#define MPIDU_SOCKI_VALIDATE_FD(pollinfo_,mpi_errno_,fail_label_)#define MPIDU_SOCKI_VERIFY_NO_POSTED_READ(pollfd_,pollinfo_,mpi_errno,fail_label_)#define MPIDU_SOCKI_VERIFY_NO_POSTED_WRITE(pollfd_,pollinfo_,mpi_errno,fail_label_)#endif#ifdef MPICH_IS_THREADED

⌨️ 快捷键说明

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