1
1

Update the PMIx listener to avoid leaking sockets into children, and better handle race condition errors

Этот коммит содержится в:
Ralph Castain 2016-07-03 08:23:33 -07:00
родитель 59bf1f0c41
Коммит 673f82e2b6

18
opal/mca/pmix/pmix2x/pmix/src/server/pmix_server_listener.c Обычный файл → Исполняемый файл
Просмотреть файл

@ -87,6 +87,13 @@ pmix_status_t pmix_start_listening(pmix_listener_t *lt)
printf("%s:%d socket() failed\n", __FILE__, __LINE__);
return PMIX_ERROR;
}
/* Set the socket to close-on-exec so that no children inherit
* this FD */
if (pmix_fd_set_cloexec(lt->socket) != PMIX_SUCCESS) {
CLOSE_THE_SOCKET(lt->socket);
return PMIX_ERROR;
}
addrlen = sizeof(struct sockaddr_un);
@ -296,8 +303,17 @@ static void* listen_thread(void *obj)
PMIX_RELEASE(pending_connection);
if (pmix_socket_errno != EAGAIN ||
pmix_socket_errno != EWOULDBLOCK) {
if (EMFILE == pmix_socket_errno) {
if (EMFILE == pmix_socket_errno ||
ENOBUFS == pmix_socket_errno ||
ENOMEM == pmix_socket_errno) {
PMIX_ERROR_LOG(PMIX_ERR_OUT_OF_RESOURCE);
} else if (EINVAL == pmix_socket_errno ||
EINTR == pmix_socket_errno) {
/* race condition at finalize */
goto done;
} else if (ECONNABORTED == pmix_socket_errno) {
/* they aborted the attempt */
continue;
} else {
pmix_output(0, "listen_thread: accept() failed: %s (%d).",
strerror(pmix_socket_errno), pmix_socket_errno);