diff options
| -rw-r--r-- | src/platform/posix/posix_epdesc.c | 14 | ||||
| -rw-r--r-- | src/platform/posix/posix_pipedesc.c | 9 | ||||
| -rw-r--r-- | src/platform/posix/posix_pollq_poll.c | 4 |
3 files changed, 14 insertions, 13 deletions
diff --git a/src/platform/posix/posix_epdesc.c b/src/platform/posix/posix_epdesc.c index 5b1d6a9c..3da36fa2 100644 --- a/src/platform/posix/posix_epdesc.c +++ b/src/platform/posix/posix_epdesc.c @@ -18,6 +18,7 @@ #include <fcntl.h> #include <netdb.h> #include <poll.h> +#include <stdbool.h> #include <stdlib.h> #include <string.h> #include <sys/socket.h> @@ -36,7 +37,7 @@ struct nni_posix_epdesc { nni_posix_pollq_node node; nni_list connectq; nni_list acceptq; - int closed; + bool closed; struct sockaddr_storage locaddr; struct sockaddr_storage remaddr; socklen_t loclen; @@ -131,9 +132,6 @@ nni_posix_epdesc_doaccept(nni_posix_epdesc *ed) int newfd; while ((aio = nni_list_first(&ed->acceptq)) != NULL) { -// We could argue that knowing the remote peer address would -// be nice. But frankly if someone wants it, they can just -// do getpeername(). #ifdef NNG_USE_ACCEPT4 newfd = accept4(ed->node.fd, NULL, NULL, SOCK_CLOEXEC); @@ -201,7 +199,7 @@ nni_posix_epdesc_doclose(nni_posix_epdesc *ed) struct sockaddr_un *sun; int fd; - ed->closed = 1; + ed->closed = true; while ((aio = nni_list_first(&ed->acceptq)) != NULL) { nni_posix_epdesc_finish(aio, NNG_ECLOSED, 0); } @@ -250,7 +248,9 @@ nni_posix_epdesc_cb(void *arg) if (!nni_list_empty(&ed->acceptq)) { events |= POLLIN; } - nni_posix_pollq_arm(&ed->node, events); + if ((!ed->closed) && (events != 0)) { + nni_posix_pollq_arm(&ed->node, events); + } nni_mtx_unlock(&ed->mtx); } @@ -433,6 +433,8 @@ nni_posix_epdesc_init(nni_posix_epdesc **edp) ed->node.index = 0; ed->node.cb = nni_posix_epdesc_cb; ed->node.data = ed; + ed->node.fd = -1; + ed->closed = false; nni_aio_list_init(&ed->connectq); nni_aio_list_init(&ed->acceptq); diff --git a/src/platform/posix/posix_pipedesc.c b/src/platform/posix/posix_pipedesc.c index 7cbf534b..05f3f13f 100644 --- a/src/platform/posix/posix_pipedesc.c +++ b/src/platform/posix/posix_pipedesc.c @@ -17,6 +17,7 @@ #include <errno.h> #include <fcntl.h> #include <poll.h> +#include <stdbool.h> #include <stdlib.h> #include <string.h> #include <sys/socket.h> @@ -31,7 +32,7 @@ struct nni_posix_pipedesc { nni_posix_pollq_node node; nni_list readq; nni_list writeq; - int closed; + bool closed; nni_mtx mtx; }; @@ -48,7 +49,7 @@ nni_posix_pipedesc_doclose(nni_posix_pipedesc *pd) nni_aio *aio; int fd; - pd->closed = 1; + pd->closed = true; while ((aio = nni_list_first(&pd->readq)) != NULL) { nni_posix_pipedesc_finish(aio, NNG_ECLOSED); } @@ -213,7 +214,7 @@ nni_posix_pipedesc_cb(void *arg) if (!nni_list_empty(&pd->readq)) { events |= POLLIN; } - if (events) { + if ((!pd->closed) && (events != 0)) { nni_posix_pollq_arm(&pd->node, events); } } @@ -341,7 +342,7 @@ nni_posix_pipedesc_init(nni_posix_pipedesc **pdp, int fd) // one. For now we just have a global pollq. Note that by tying // the pd to a single pollq we may get some kind of cache warmth. - pd->closed = 0; + pd->closed = false; pd->node.fd = fd; pd->node.cb = nni_posix_pipedesc_cb; pd->node.data = pd; diff --git a/src/platform/posix/posix_pollq_poll.c b/src/platform/posix/posix_pollq_poll.c index 8b386ecd..8e3bc741 100644 --- a/src/platform/posix/posix_pollq_poll.c +++ b/src/platform/posix/posix_pollq_poll.c @@ -283,9 +283,7 @@ nni_posix_pollq_arm(nni_posix_pollq_node *node, int events) nni_posix_pollq *pq = node->pq; int oevents; - if (pq == NULL) { - return; - } + NNI_ASSERT(pq != NULL); nni_mtx_lock(&pq->mtx); oevents = node->events; |
