// // Copyright 2017 Garrett D'Amore // // This software is supplied under the terms of the MIT License, a // copy of which should be located in the distribution where this // file was obtained (LICENSE.txt). A copy of the license may also be // found online at https://opensource.org/licenses/MIT. // #include #include "core/nng_impl.h" #define NNI_AIO_WAKE (1<<0) int nni_aio_init(nni_aio *aio, nni_cb cb, void *arg) { int rv; if (cb == NULL) { cb = (nni_cb) nni_aio_wake; arg = aio; } memset(aio, 0, sizeof (*aio)); if ((rv = nni_mtx_init(&aio->a_lk)) != 0) { return (rv); } if ((rv = nni_cv_init(&aio->a_cv, &aio->a_lk)) != 0) { nni_mtx_fini(&aio->a_lk); return (rv); } aio->a_cb = cb; aio->a_cbarg = arg; aio->a_expire = NNI_TIME_NEVER; nni_taskq_ent_init(&aio->a_tqe, cb, arg); return (0); } void nni_aio_fini(nni_aio *aio) { nni_cv_fini(&aio->a_cv); nni_mtx_fini(&aio->a_lk); } int nni_aio_result(nni_aio *aio) { return (aio->a_result); } size_t nni_aio_count(nni_aio *aio) { return (aio->a_count); } void nni_aio_wake(nni_aio *aio) { nni_mtx_lock(&aio->a_lk); aio->a_flags |= NNI_AIO_WAKE; nni_cv_wake(&aio->a_cv); nni_mtx_unlock(&aio->a_lk); } void nni_aio_wait(nni_aio *aio) { nni_mtx_lock(&aio->a_lk); while ((aio->a_flags & NNI_AIO_WAKE) == 0) { nni_cv_wait(&aio->a_cv); } nni_mtx_unlock(&aio->a_lk); } // I/O provider related functions. void nni_aio_finish(nni_aio *aio, int result, size_t count) { nni_cb cb; void *arg; nni_mtx_lock(&aio->a_lk); aio->a_result = result; aio->a_count = count; cb = aio->a_cb; arg = aio->a_cbarg; nni_cv_wake(&aio->a_cv); nni_mtx_unlock(&aio->a_lk); nni_taskq_dispatch(NULL, &aio->a_tqe); }