diff --git a/opal/mca/pmix/pmix112/pmix/src/usock/usock_sendrecv.c b/opal/mca/pmix/pmix112/pmix/src/usock/usock_sendrecv.c index d6f8764258..f77e15155b 100644 --- a/opal/mca/pmix/pmix112/pmix/src/usock/usock_sendrecv.c +++ b/opal/mca/pmix/pmix112/pmix/src/usock/usock_sendrecv.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014-2015 Intel, Inc. All rights reserved. + * Copyright (c) 2014-2016 Intel, Inc. All rights reserved. * Copyright (c) 2014 Artem Y. Polyakov . * All rights reserved. * Copyright (c) 2015 Research Organization for Information Science @@ -36,13 +36,46 @@ #include #endif +#include "src/class/pmix_pointer_array.h" #include "src/include/pmix_globals.h" +#include "src/server/pmix_server_ops.h" #include "src/util/error.h" #include "usock.h" static uint32_t current_tag = 1; // 0 is reserved for system purposes +static void lost_connection(pmix_peer_t *peer, pmix_status_t err) +{ + /* stop all events */ + if (peer->recv_ev_active) { + event_del(&peer->recv_event); + peer->recv_ev_active = false; + } + if (peer->send_ev_active) { + event_del(&peer->send_event); + peer->send_ev_active = false; + } + if (NULL != peer->recv_msg) { + PMIX_RELEASE(peer->recv_msg); + peer->recv_msg = NULL; + } + CLOSE_THE_SOCKET(peer->sd); + if (pmix_globals.server) { + /* if I am a server, then we need to + * do some cleanup as the client has + * left us */ + pmix_pointer_array_set_item(&pmix_server_globals.clients, + peer->index, NULL); + PMIX_RELEASE(peer); + } else { + /* if I am a client, there is only + * one connection we can have */ + pmix_globals.connected = false; + } + PMIX_REPORT_ERROR(err); +} + static pmix_status_t send_bytes(int sd, char **buf, size_t *remain) { pmix_status_t ret = PMIX_SUCCESS; @@ -183,8 +216,7 @@ void pmix_usock_send_handler(int sd, short flags, void *cbdata) peer->send_ev_active = false; PMIX_RELEASE(msg); peer->send_msg = NULL; - CLOSE_THE_SOCKET(peer->sd); - PMIX_REPORT_ERROR(rc); + lost_connection(peer, rc); return; } } @@ -212,8 +244,7 @@ void pmix_usock_send_handler(int sd, short flags, void *cbdata) peer->send_ev_active = false; PMIX_RELEASE(msg); peer->send_msg = NULL; - CLOSE_THE_SOCKET(peer->sd); - PMIX_REPORT_ERROR(rc); + lost_connection(peer, rc); return; } } @@ -357,8 +388,7 @@ void pmix_usock_recv_handler(int sd, short flags, void *cbdata) PMIX_RELEASE(peer->recv_msg); peer->recv_msg = NULL; } - CLOSE_THE_SOCKET(peer->sd); - PMIX_REPORT_ERROR(PMIX_ERR_UNREACH); + lost_connection(peer, PMIX_ERR_UNREACH); } void pmix_usock_send_recv(int fd, short args, void *cbdata) diff --git a/opal/mca/pmix/pmix112/pmix/src/util/error.h b/opal/mca/pmix/pmix112/pmix/src/util/error.h index 29e60c950f..0efabcdabf 100644 --- a/opal/mca/pmix/pmix112/pmix/src/util/error.h +++ b/opal/mca/pmix/pmix112/pmix/src/util/error.h @@ -9,7 +9,7 @@ * University of Stuttgart. All rights reserved. * Copyright (c) 2004-2005 The Regents of the University of California. * All rights reserved. - * Copyright (c) 2015 Intel, Inc. All rights reserved + * Copyright (c) 2015-2016 Intel, Inc. All rights reserved * $COPYRIGHT$ * * Additional copyrights may follow @@ -36,11 +36,8 @@ BEGIN_C_DECLS } \ }while(0); -#define PMIX_REPORT_ERROR(e) \ - do { \ - pmix_globals.connected = false; \ - pmix_errhandler_invoke(e, NULL, 0, NULL, 0); \ - } while(0); +#define PMIX_REPORT_ERROR(e) \ + pmix_errhandler_invoke(e, NULL, 0, NULL, 0) PMIX_DECLSPEC void pmix_errhandler_invoke(pmix_status_t status, pmix_proc_t procs[], size_t nprocs,