📄 sock.c
字号:
return mpi_errno; } return MPI_SUCCESS;}/* sock functions */#undef FUNCNAME#define FUNCNAME MPIDU_Sock_init#undef FCNAME#define FCNAME MPIDI_QUOTE(FUNCNAME)int MPIDU_Sock_init(){ int mpi_errno; char *szNum, *szRange; WSADATA wsaData; int err; MPIDI_STATE_DECL(MPID_STATE_MPIDU_SOCK_INIT); MPIDI_FUNC_ENTER(MPID_STATE_MPIDU_SOCK_INIT); if (g_init_called) { g_init_called++; /*printf("sock init %d\n", g_init_called);fflush(stdout);*/ /* mpi_errno = MPIR_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE, FCNAME, __LINE__, MPIDU_SOCK_ERR_INIT, "**sock_init", 0); MPIDI_FUNC_EXIT(MPID_STATE_MPIDU_SOCK_INIT); return mpi_errno; */ return MPI_SUCCESS; } /* Start the Winsock dll */ if ((err = WSAStartup(MAKEWORD(2, 0), &wsaData)) != 0) { mpi_errno = MPIR_Err_create_code(MPI_SUCCESS, MPIR_ERR_FATAL, FCNAME, __LINE__, MPIDU_SOCK_ERR_FAIL, "**wsasock", "**wsasock %s %d", get_error_string(err), err); MPIDI_FUNC_EXIT(MPID_STATE_MPIDU_SOCK_INIT); return mpi_errno; } /* get the socket buffer size */ szNum = getenv("MPICH_SOCKET_BUFFER_SIZE"); if (szNum != NULL) { g_socket_buffer_size = atoi(szNum); if (g_socket_buffer_size < 0) g_socket_buffer_size = SOCKI_TCP_BUFFER_SIZE; } g_socket_rbuffer_size = g_socket_buffer_size; g_socket_sbuffer_size = g_socket_buffer_size; szNum = getenv("MPICH_SOCKET_RBUFFER_SIZE"); if (szNum != NULL) { g_socket_rbuffer_size = atoi(szNum); if (g_socket_rbuffer_size < 0) g_socket_rbuffer_size = g_socket_buffer_size; } szNum = getenv("MPICH_SOCKET_SBUFFER_SIZE"); if (szNum != NULL) { g_socket_sbuffer_size = atoi(szNum); if (g_socket_sbuffer_size < 0) g_socket_sbuffer_size = g_socket_buffer_size; } /* get the number of accepts to pre-post */ szNum = getenv("MPICH_SOCKET_NUM_PREPOSTED_ACCEPTS"); if (szNum != NULL) { g_num_posted_accepts = atoi(szNum); if (g_num_posted_accepts < 1) g_num_posted_accepts = SOCKI_NUM_PREPOSTED_ACCEPTS; } /* check to see if a port range was specified */ szRange = getenv("MPICH_PORT_RANGE"); if (szRange != NULL) { szNum = strtok(szRange, ",.:"); /* tokenize min,max and min..max and min:max */ if (szNum) { g_min_port = atoi(szNum); szNum = strtok(NULL, ",.:"); if (szNum) { g_max_port = atoi(szNum); } } /* check for invalid values */ if (g_min_port < 0 || g_max_port < g_min_port) { g_min_port = g_max_port = 0; } /* printf("using min_port = %d, max_port = %d\n", g_min_port, g_max_port); fflush(stdout); */ } init_state_struct(&g_wakeup_state); g_wakeup_state.type = SOCKI_WAKEUP; g_init_called = 1; /*printf("sock init %d\n", g_init_called);fflush(stdout);*/ MPIDI_FUNC_EXIT(MPID_STATE_MPIDU_SOCK_INIT); return MPI_SUCCESS;}#undef FUNCNAME#define FUNCNAME MPIDU_Sock_finalize#undef FCNAME#define FCNAME MPIDI_QUOTE(FUNCNAME)int MPIDU_Sock_finalize(){ int mpi_errno; sock_state_t *iter; MPIDI_STATE_DECL(MPID_STATE_MPIDU_SOCK_FINALIZE); MPIDI_FUNC_ENTER(MPID_STATE_MPIDU_SOCK_FINALIZE); if (!g_init_called) { mpi_errno = MPIR_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE, FCNAME, __LINE__, MPIDU_SOCK_ERR_INIT, "**sock_init", 0); MPIDI_FUNC_EXIT(MPID_STATE_MPIDU_SOCK_FINALIZE); return mpi_errno; } g_init_called--; if (g_init_called == 0) { iter = g_sock_list; while (iter) { if (iter->sock != INVALID_SOCKET) { /*printf("sock %d not closed before finalize\n", iter->sock);fflush(stdout);*/ closesocket(iter->sock); iter->sock = INVALID_SOCKET; } iter = iter->next_sock; if (iter == g_sock_list) { /* catch loops */ /*printf("sock list has a loop\n");fflush(stdout);*/ break; } } WSACleanup(); } MPIDI_FUNC_EXIT(MPID_STATE_MPIDU_SOCK_FINALIZE); return MPI_SUCCESS;}typedef struct socki_host_name_t{ char host[256]; struct socki_host_name_t *next;} socki_host_name_t;static int already_used_or_add(char *host, socki_host_name_t **list){ socki_host_name_t *iter, *trailer; /* check if the host already has been used */ iter = trailer = *list; while (iter) { if (strcmp(iter->host, host) == 0) { return 1; } if (trailer != iter) trailer = trailer->next; iter = iter->next; } /* the host has not been used so add a node for it */ iter = (socki_host_name_t*)MPIU_Malloc(sizeof(socki_host_name_t)); if (!iter) { /* if out of memory then treat it as not found */ return 0; } MPIU_Strncpy(iter->host, host, 256); /* insert new hosts at the end of the list */ if (trailer != NULL) { trailer->next = iter; iter->next = NULL; } else { iter->next = NULL; *list = iter; } /* insert new hosts at the beginning of the list iter->next = *list; *list = iter; */ return 0;}static void socki_free_host_list(socki_host_name_t *list){ socki_host_name_t *iter; while (list) { iter = list; list = list->next; MPIU_Free(iter); }}static int socki_get_host_list(char *hostname, socki_host_name_t **listp){ int mpi_errno; struct addrinfo *res, *iter, hint; char host[256]; socki_host_name_t *list = NULL; /* add the hostname to the beginning of the list */ already_used_or_add(hostname, &list); hint.ai_flags = AI_PASSIVE | AI_CANONNAME; hint.ai_family = PF_UNSPEC; hint.ai_socktype = SOCK_STREAM; hint.ai_protocol = 0; hint.ai_addrlen = 0; hint.ai_canonname = NULL; hint.ai_addr = 0; hint.ai_next = NULL; if (getaddrinfo(hostname, NULL, NULL/*&hint*/, &res)) { mpi_errno = MPIR_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE, FCNAME, __LINE__, MPIDU_SOCK_ERR_FAIL, "**getinfo", "**getinfo %s %d", strerror(errno), errno); return mpi_errno; } /* add the host names */ iter = res; while (iter) { if (iter->ai_canonname) { already_used_or_add(iter->ai_canonname, &list); } else { switch (iter->ai_family) { case PF_INET: case PF_INET6: if (getnameinfo(iter->ai_addr, (socklen_t)iter->ai_addrlen, host, 256, NULL, 0, 0) == 0) { already_used_or_add(host, &list); } break; } } iter = iter->ai_next; } /* add the names again, this time as ip addresses */ iter = res; while (iter) { switch (iter->ai_family) { case PF_INET: case PF_INET6: if (getnameinfo(iter->ai_addr, (socklen_t)iter->ai_addrlen, host, 256, NULL, 0, NI_NUMERICHOST) == 0) { already_used_or_add(host, &list); } break; } iter = iter->ai_next; } if (res) { freeaddrinfo(res); } *listp = list; return MPI_SUCCESS;}#undef FUNCNAME#define FUNCNAME MPIDU_Sock_hostname_to_host_description#undef FCNAME#define FCNAME MPIU_QUOTE(FUNCNAME)int MPIDU_Sock_hostname_to_host_description(char *hostname, char *host_description, int len){ int mpi_errno = MPI_SUCCESS; socki_host_name_t *iter, *list = NULL; MPIDI_STATE_DECL(MPID_STATE_MPIDU_SOCK_HOSTNAME_TO_HOST_DESCRIPTION); MPIDI_FUNC_ENTER(MPID_STATE_MPIDU_SOCK_HOSTNAME_TO_HOST_DESCRIPTION); if (!g_init_called) { mpi_errno = MPIR_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE, FCNAME, __LINE__, MPIDU_SOCK_ERR_INIT, "**sock_init", 0); MPIDI_FUNC_EXIT(MPID_STATE_MPIDU_SOCK_HOSTNAME_TO_HOST_DESCRIPTION); return mpi_errno; } mpi_errno = socki_get_host_list(hostname, &list); if (mpi_errno != MPI_SUCCESS) { mpi_errno = MPIR_Err_create_code(mpi_errno, MPIR_ERR_RECOVERABLE, FCNAME, __LINE__, MPI_ERR_OTHER, "**fail", 0); goto fn_exit; } iter = list; while (iter) { MPIU_DBG_PRINTF(("adding host: %s\n", iter->host)); mpi_errno = MPIU_Str_add_string(&host_description, &len, iter->host); if (mpi_errno != MPI_SUCCESS) { mpi_errno = MPIR_Err_create_code(mpi_errno, MPIR_ERR_RECOVERABLE, FCNAME, __LINE__, MPIDU_SOCK_ERR_NOMEM, "**desc_len", 0); goto fn_exit; } iter = iter->next; } fn_exit: socki_free_host_list(list); MPIDI_FUNC_EXIT(MPID_STATE_MPIDU_SOCK_HOSTNAME_TO_HOST_DESCRIPTION); return mpi_errno;}#undef FUNCNAME#define FUNCNAME MPIDU_Sock_get_host_description#undef FCNAME#define FCNAME MPIDI_QUOTE(FUNCNAME)int MPIDU_Sock_get_host_description(int myRank, char * host_description, int len){ int mpi_errno; char hostname[100]; DWORD length = 100; char *env; MPIDI_STATE_DECL(MPID_STATE_MPIDU_SOCK_GET_HOST_DESCRIPTION); MPIDI_FUNC_ENTER(MPID_STATE_MPIDU_SOCK_GET_HOST_DESCRIPTION); if (!g_init_called) { mpi_errno = MPIR_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE, FCNAME, __LINE__, MPIDU_SOCK_ERR_INIT, "**sock_init", 0); MPIDI_FUNC_EXIT(MPID_STATE_MPIDU_SOCK_GET_HOST_DESCRIPTION); return mpi_errno; } env = getenv("MPICH_INTERFACE_HOSTNAME"); if (env != NULL && *env != '\0') { MPIU_Strncpy(hostname, env, sizeof(hostname)); } else { /*if (gethostname(hostname, 100) == SOCKET_ERROR)*/ /*if (!GetComputerName(hostname, &length))*/ if (!GetComputerNameEx(ComputerNameDnsFullyQualified, hostname, &length)) { mpi_errno = WSAGetLastError(); mpi_errno = MPIR_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE, FCNAME, __LINE__, MPIDU_SOCK_ERR_FAIL, "**sock_gethost", "**sock_gethost %s %d", get_error_string(mpi_errno), mpi_errno); MPIDI_FUNC_EXIT(MPID_STATE_MPIDU_SOCK_GET_HOST_DESCRIPTION); return mpi_errno; } } mpi_errno = MPIDU_Sock_hostname_to_host_description(hostname, host_description, len); if (mpi_errno != MPI_SUCCESS) { mpi_errno = MPIR_Err_create_code(mpi_errno, MPIR_ERR_RECOVERABLE, FCNAME, __LINE__, MPI_ERR_OTHER, "**fail", 0); } MPIDI_FUNC_EXIT(MPID_STATE_MPIDU_SOCK_GET_HOST_DESCRIPTION); return mpi_errno;}#undef FUNCNAME#define FUNCNAME MPIDU_Sock_create_set#undef FCNAME#define FCNAME MPIDI_QUOTE(FUNCNAME)int MPIDU_Sock_create_set(MPIDU_Sock_set_t * set){ int mpi_errno; HANDLE port; MPIDI_STATE_DECL(MPID_STATE_MPIDU_SOCK_CREATE_SET); MPIDI_FUNC_ENTER(MPID_STATE_MPIDU_SOCK_CREATE_SET); if (!g_init_called) { mpi_errno = MPIR_Err_create_code(MPI_SUCCESS, MPIR_ERR_RECOVERABLE, FCNAME, __LINE__, MPIDU_SOCK_ERR_INIT, "**sock_init", 0);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -