diff options
Diffstat (limited to 'src/core/aio.c')
| -rw-r--r-- | src/core/aio.c | 30 |
1 files changed, 28 insertions, 2 deletions
diff --git a/src/core/aio.c b/src/core/aio.c index c6e0ed97..a036a606 100644 --- a/src/core/aio.c +++ b/src/core/aio.c @@ -66,8 +66,10 @@ nni_aio_init(nni_aio **aiop, nni_cb cb, void *arg) } memset(aio, 0, sizeof(*aio)); nni_cv_init(&aio->a_cv, &nni_aio_lk); - aio->a_expire = NNI_TIME_NEVER; - aio->a_timeout = NNG_DURATION_INFINITE; + aio->a_expire = NNI_TIME_NEVER; + aio->a_timeout = NNG_DURATION_INFINITE; + aio->a_iov = aio->a_iovinl; + aio->a_niovalloc = 0; if (arg == NULL) { arg = aio; } @@ -85,10 +87,34 @@ nni_aio_fini(nni_aio *aio) // At this point the AIO is done. nni_cv_fini(&aio->a_cv); + if (aio->a_niovalloc > 0) { + NNI_FREE_STRUCTS(aio->a_iov, aio->a_niovalloc); + } + NNI_FREE_STRUCT(aio); } } +int +nni_aio_set_iov(nni_aio *aio, int niov, nng_iov *iov) +{ + if ((niov > 4) && (niov > aio->a_niovalloc)) { + nni_iov *newiov = NNI_ALLOC_STRUCTS(newiov, niov); + if (newiov == NULL) { + return (NNG_ENOMEM); + } + if (aio->a_niovalloc > 0) { + NNI_FREE_STRUCTS(aio->a_iov, aio->a_niovalloc); + } + aio->a_iov = newiov; + aio->a_niovalloc = niov; + } + + memcpy(aio->a_iov, iov, niov * sizeof(nng_iov)); + aio->a_niov = niov; + return (0); +} + void nni_aio_fini_cb(nni_aio *aio) { |
