summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/core/aio.c37
1 files changed, 21 insertions, 16 deletions
diff --git a/src/core/aio.c b/src/core/aio.c
index f3af80d8..249d263a 100644
--- a/src/core/aio.c
+++ b/src/core/aio.c
@@ -147,25 +147,30 @@ nni_aio_fini(nni_aio *aio)
int
nni_aio_set_iov(nni_aio *aio, unsigned niov, const nni_iov *iov)
{
- if ((niov > NNI_NUM_ELEMENTS(aio->a_iovinl)) &&
- (niov > aio->a_niovalloc)) {
- nni_iov *newiov = NNI_ALLOC_STRUCTS(newiov, niov);
- if (newiov == NULL) {
- return (NNG_ENOMEM);
+ // Sometimes we are resubmitting our own io vector, with
+ // just a smaller niov.
+ if (aio->a_iov != iov) {
+ if ((niov > NNI_NUM_ELEMENTS(aio->a_iovinl)) &&
+ (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_iovalloc, aio->a_niovalloc);
+ }
+ aio->a_iov = newiov;
+ aio->a_iovalloc = newiov;
+ aio->a_niovalloc = niov;
}
- if (aio->a_niovalloc > 0) {
- NNI_FREE_STRUCTS(aio->a_iovalloc, aio->a_niovalloc);
+ if (niov <= NNI_NUM_ELEMENTS(aio->a_iovinl)) {
+ aio->a_iov = aio->a_iovinl;
+ } else {
+ aio->a_iov = aio->a_iovalloc;
}
- aio->a_iov = newiov;
- aio->a_iovalloc = newiov;
- aio->a_niovalloc = niov;
- }
- if (niov <= NNI_NUM_ELEMENTS(aio->a_iovinl)) {
- aio->a_iov = aio->a_iovinl;
- } else {
- aio->a_iov = aio->a_iovalloc;
+ memcpy(aio->a_iov, iov, niov * sizeof(nni_iov));
}
- memcpy(aio->a_iov, iov, niov * sizeof(nni_iov));
aio->a_niov = niov;
return (0);
}