aboutsummaryrefslogtreecommitdiff
path: root/src/core
diff options
context:
space:
mode:
Diffstat (limited to 'src/core')
-rw-r--r--src/core/aio.h3
-rw-r--r--src/core/msgqueue.c17
2 files changed, 13 insertions, 7 deletions
diff --git a/src/core/aio.h b/src/core/aio.h
index 80a3ac02..96b04857 100644
--- a/src/core/aio.h
+++ b/src/core/aio.h
@@ -55,7 +55,8 @@ extern int nni_aio_init(nni_aio *, nni_cb, void *);
// nni_aio_fini finalizes the aio, releasing resources (locks)
// associated with it. The caller is responsible for ensuring that any
-// associated I/O is unscheduled or complete.
+// associated I/O is unscheduled or complete. This is safe to call
+// on zero'd memory.
extern void nni_aio_fini(nni_aio *);
// nni_aio_result returns the result code (0 on success, or an NNG errno)
diff --git a/src/core/msgqueue.c b/src/core/msgqueue.c
index dc3f84f9..147c0e20 100644
--- a/src/core/msgqueue.c
+++ b/src/core/msgqueue.c
@@ -517,11 +517,13 @@ nni_msgq_run_timeout(void *arg)
naio = nni_list_first(&mq->mq_aio_getq);
while ((aio = naio) != NULL) {
naio = nni_list_next(&mq->mq_aio_getq, aio);
- if (now >= aio->a_expire) {
+ if (aio->a_expire == NNI_TIME_ZERO) {
+ nni_list_remove(&mq->mq_aio_getq, aio);
+ nni_aio_finish(aio, NNG_EAGAIN, 0);
+ } else if (now >= aio->a_expire) {
nni_list_remove(&mq->mq_aio_getq, aio);
nni_aio_finish(aio, NNG_ETIMEDOUT, 0);
- }
- if (exp > aio->a_expire) {
+ } else if (exp > aio->a_expire) {
exp = aio->a_expire;
}
}
@@ -529,11 +531,13 @@ nni_msgq_run_timeout(void *arg)
naio = nni_list_first(&mq->mq_aio_putq);
while ((aio = naio) != NULL) {
naio = nni_list_next(&mq->mq_aio_putq, aio);
- if (now >= aio->a_expire) {
+ if (aio->a_expire == NNI_TIME_ZERO) {
+ nni_list_remove(&mq->mq_aio_putq, aio);
+ nni_aio_finish(aio, NNG_EAGAIN, 0);
+ } else if (now >= aio->a_expire) {
nni_list_remove(&mq->mq_aio_putq, aio);
nni_aio_finish(aio, NNG_ETIMEDOUT, 0);
- }
- if (exp > aio->a_expire) {
+ } else if (exp > aio->a_expire) {
exp = aio->a_expire;
}
}
@@ -748,6 +752,7 @@ nni_msgq_put_until(nni_msgq *mq, nni_msg *msg, nni_time expire)
aio.a_msg = msg;
nni_msgq_aio_put(mq, &aio);
nni_aio_wait(&aio);
+ rv = nni_aio_result(&aio);
nni_aio_fini(&aio);
return (rv);
}