diff options
| author | Garrett D'Amore <garrett@damore.org> | 2017-03-06 01:12:00 -0800 |
|---|---|---|
| committer | Garrett D'Amore <garrett@damore.org> | 2017-03-06 01:12:00 -0800 |
| commit | 44a6de38d240143ec2b4bb6f6457bae81271820a (patch) | |
| tree | 0b0f330b515227f29d302d91f872c12e3d9a9395 /src/core | |
| parent | 884da789532be511245248206adb00696ae62d31 (diff) | |
| download | nng-44a6de38d240143ec2b4bb6f6457bae81271820a.tar.gz nng-44a6de38d240143ec2b4bb6f6457bae81271820a.tar.bz2 nng-44a6de38d240143ec2b4bb6f6457bae81271820a.zip | |
Pair protocol now callback driven.
Diffstat (limited to 'src/core')
| -rw-r--r-- | src/core/aio.h | 3 | ||||
| -rw-r--r-- | src/core/msgqueue.c | 17 |
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); } |
