|
1 | 1 | /*
|
2 |
| - * Copyright (c) 2014-2015 Intel, Inc. All rights reserved. |
| 2 | + * Copyright (c) 2014-2016 Intel, Inc. All rights reserved. |
3 | 3 | * Copyright (c) 2014 Artem Y. Polyakov <[email protected]>.
|
4 | 4 | * All rights reserved.
|
5 | 5 | * Copyright (c) 2015 Research Organization for Information Science
|
|
36 | 36 | #include <sys/types.h>
|
37 | 37 | #endif
|
38 | 38 |
|
| 39 | +#include "src/class/pmix_pointer_array.h" |
39 | 40 | #include "src/include/pmix_globals.h"
|
| 41 | +#include "src/server/pmix_server_ops.h" |
40 | 42 | #include "src/util/error.h"
|
41 | 43 |
|
42 | 44 | #include "usock.h"
|
43 | 45 |
|
44 | 46 | static uint32_t current_tag = 1; // 0 is reserved for system purposes
|
45 | 47 |
|
| 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 | + |
46 | 79 | static pmix_status_t send_bytes(int sd, char **buf, size_t *remain)
|
47 | 80 | {
|
48 | 81 | pmix_status_t ret = PMIX_SUCCESS;
|
@@ -183,8 +216,7 @@ void pmix_usock_send_handler(int sd, short flags, void *cbdata)
|
183 | 216 | peer->send_ev_active = false;
|
184 | 217 | PMIX_RELEASE(msg);
|
185 | 218 | peer->send_msg = NULL;
|
186 |
| - CLOSE_THE_SOCKET(peer->sd); |
187 |
| - PMIX_REPORT_ERROR(rc); |
| 219 | + lost_connection(peer, rc); |
188 | 220 | return;
|
189 | 221 | }
|
190 | 222 | }
|
@@ -212,8 +244,7 @@ void pmix_usock_send_handler(int sd, short flags, void *cbdata)
|
212 | 244 | peer->send_ev_active = false;
|
213 | 245 | PMIX_RELEASE(msg);
|
214 | 246 | peer->send_msg = NULL;
|
215 |
| - CLOSE_THE_SOCKET(peer->sd); |
216 |
| - PMIX_REPORT_ERROR(rc); |
| 247 | + lost_connection(peer, rc); |
217 | 248 | return;
|
218 | 249 | }
|
219 | 250 | }
|
@@ -357,8 +388,7 @@ void pmix_usock_recv_handler(int sd, short flags, void *cbdata)
|
357 | 388 | PMIX_RELEASE(peer->recv_msg);
|
358 | 389 | peer->recv_msg = NULL;
|
359 | 390 | }
|
360 |
| - CLOSE_THE_SOCKET(peer->sd); |
361 |
| - PMIX_REPORT_ERROR(PMIX_ERR_UNREACH); |
| 391 | + lost_connection(peer, PMIX_ERR_UNREACH); |
362 | 392 | }
|
363 | 393 |
|
364 | 394 | void pmix_usock_send_recv(int fd, short args, void *cbdata)
|
|
0 commit comments