aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGarrett D'Amore <garrett@damore.org>2018-02-21 11:08:23 -0800
committerGarrett D'Amore <garrett@damore.org>2018-02-21 11:08:23 -0800
commita4d378030df61760ea4daa2ddbe46b1366f8e977 (patch)
tree7bd8bc37acb1aea849eee2daab429e36676fd59e /src
parent5fe9202ffedf3a57ec789d622bc52efc3435628b (diff)
downloadnng-a4d378030df61760ea4daa2ddbe46b1366f8e977.tar.gz
nng-a4d378030df61760ea4daa2ddbe46b1366f8e977.tar.bz2
nng-a4d378030df61760ea4daa2ddbe46b1366f8e977.zip
Fixes for POSIX pollq structure.
It was possible for pollq arm to be called on a node that was removed in some circumstances -- particularly and ep that was closed in the callback. While here, lets use normal booleans for closed state, and only call the arm function (which is not free -- typicall it involves a mutex and may even involve a system call) if we are going to arm some events. We also initialize these things properly, and clean up a stale comment. This work is done to faciliate the kqueue work by @liamstask.
Diffstat (limited to 'src')
-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;