aboutsummaryrefslogtreecommitdiff
path: root/src/core/aio.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/core/aio.c')
-rw-r--r--src/core/aio.c30
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)
{