aboutsummaryrefslogtreecommitdiff
path: root/src/core/aio.c
diff options
context:
space:
mode:
authorGarrett D'Amore <garrett@damore.org>2018-01-29 13:27:52 -0800
committerGarrett D'Amore <garrett@damore.org>2018-01-29 13:27:52 -0800
commit5914e40c2ff7fcf346c90705785f3fb7650a9fdc (patch)
treed769f4110a76679df0ffcf2b4e953bb9b9f3687d /src/core/aio.c
parente32022c8085fc6b05ed690f9b4b49536d8df13b1 (diff)
downloadnng-5914e40c2ff7fcf346c90705785f3fb7650a9fdc.tar.gz
nng-5914e40c2ff7fcf346c90705785f3fb7650a9fdc.tar.bz2
nng-5914e40c2ff7fcf346c90705785f3fb7650a9fdc.zip
Expose scatter/gather I/O vectors; we will use for HTTP API.
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)
{