|
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