diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/core/aio.c | 37 |
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); } |
