Skip to content

Commit 2745610

Browse files
author
rhc54
committed
Merge pull request #1377 from rhc54/topic/pmix
Plug a leak in the PMIx subsystem
2 parents dc4d3ed + efb0eff commit 2745610

File tree

2 files changed

+40
-13
lines changed

2 files changed

+40
-13
lines changed

opal/mca/pmix/pmix112/pmix/src/usock/usock_sendrecv.c

Lines changed: 37 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2014-2015 Intel, Inc. All rights reserved.
2+
* Copyright (c) 2014-2016 Intel, Inc. All rights reserved.
33
* Copyright (c) 2014 Artem Y. Polyakov <[email protected]>.
44
* All rights reserved.
55
* Copyright (c) 2015 Research Organization for Information Science
@@ -36,13 +36,46 @@
3636
#include <sys/types.h>
3737
#endif
3838

39+
#include "src/class/pmix_pointer_array.h"
3940
#include "src/include/pmix_globals.h"
41+
#include "src/server/pmix_server_ops.h"
4042
#include "src/util/error.h"
4143

4244
#include "usock.h"
4345

4446
static uint32_t current_tag = 1; // 0 is reserved for system purposes
4547

48+
static void lost_connection(pmix_peer_t *peer, pmix_status_t err)
49+
{
50+
/* stop all events */
51+
if (peer->recv_ev_active) {
52+
event_del(&peer->recv_event);
53+
peer->recv_ev_active = false;
54+
}
55+
if (peer->send_ev_active) {
56+
event_del(&peer->send_event);
57+
peer->send_ev_active = false;
58+
}
59+
if (NULL != peer->recv_msg) {
60+
PMIX_RELEASE(peer->recv_msg);
61+
peer->recv_msg = NULL;
62+
}
63+
CLOSE_THE_SOCKET(peer->sd);
64+
if (pmix_globals.server) {
65+
/* if I am a server, then we need to
66+
* do some cleanup as the client has
67+
* left us */
68+
pmix_pointer_array_set_item(&pmix_server_globals.clients,
69+
peer->index, NULL);
70+
PMIX_RELEASE(peer);
71+
} else {
72+
/* if I am a client, there is only
73+
* one connection we can have */
74+
pmix_globals.connected = false;
75+
}
76+
PMIX_REPORT_ERROR(err);
77+
}
78+
4679
static pmix_status_t send_bytes(int sd, char **buf, size_t *remain)
4780
{
4881
pmix_status_t ret = PMIX_SUCCESS;
@@ -183,8 +216,7 @@ void pmix_usock_send_handler(int sd, short flags, void *cbdata)
183216
peer->send_ev_active = false;
184217
PMIX_RELEASE(msg);
185218
peer->send_msg = NULL;
186-
CLOSE_THE_SOCKET(peer->sd);
187-
PMIX_REPORT_ERROR(rc);
219+
lost_connection(peer, rc);
188220
return;
189221
}
190222
}
@@ -212,8 +244,7 @@ void pmix_usock_send_handler(int sd, short flags, void *cbdata)
212244
peer->send_ev_active = false;
213245
PMIX_RELEASE(msg);
214246
peer->send_msg = NULL;
215-
CLOSE_THE_SOCKET(peer->sd);
216-
PMIX_REPORT_ERROR(rc);
247+
lost_connection(peer, rc);
217248
return;
218249
}
219250
}
@@ -357,8 +388,7 @@ void pmix_usock_recv_handler(int sd, short flags, void *cbdata)
357388
PMIX_RELEASE(peer->recv_msg);
358389
peer->recv_msg = NULL;
359390
}
360-
CLOSE_THE_SOCKET(peer->sd);
361-
PMIX_REPORT_ERROR(PMIX_ERR_UNREACH);
391+
lost_connection(peer, PMIX_ERR_UNREACH);
362392
}
363393

364394
void pmix_usock_send_recv(int fd, short args, void *cbdata)

opal/mca/pmix/pmix112/pmix/src/util/error.h

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
* University of Stuttgart. All rights reserved.
1010
* Copyright (c) 2004-2005 The Regents of the University of California.
1111
* All rights reserved.
12-
* Copyright (c) 2015 Intel, Inc. All rights reserved
12+
* Copyright (c) 2015-2016 Intel, Inc. All rights reserved
1313
* $COPYRIGHT$
1414
*
1515
* Additional copyrights may follow
@@ -36,11 +36,8 @@ BEGIN_C_DECLS
3636
} \
3737
}while(0);
3838

39-
#define PMIX_REPORT_ERROR(e) \
40-
do { \
41-
pmix_globals.connected = false; \
42-
pmix_errhandler_invoke(e, NULL, 0, NULL, 0); \
43-
} while(0);
39+
#define PMIX_REPORT_ERROR(e) \
40+
pmix_errhandler_invoke(e, NULL, 0, NULL, 0)
4441

4542
PMIX_DECLSPEC void pmix_errhandler_invoke(pmix_status_t status,
4643
pmix_proc_t procs[], size_t nprocs,

0 commit comments

Comments
 (0)