aboutsummaryrefslogtreecommitdiff
path: root/src/platform/posix
diff options
context:
space:
mode:
Diffstat (limited to 'src/platform/posix')
-rw-r--r--src/platform/posix/posix_epdesc.c14
-rw-r--r--src/platform/posix/posix_pipedesc.c9
-rw-r--r--src/platform/posix/posix_pollq_poll.c4
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;