diff --git a/ircd/aio.cc b/ircd/aio.cc index d63ed9060..f13ab62aa 100644 --- a/ircd/aio.cc +++ b/ircd/aio.cc @@ -153,32 +153,31 @@ noexcept try *reinterpret_cast(event.data) }; - // The relevant iocb is repeated back to us in the result; we assert - // some basic sanity here about the layout of the request conglomerate. assert(reinterpret_cast(event.obj) == static_cast(&request)); - - // error conventions are like so - assert(event.res >= -1); // unix syscall return value semantic - assert(event.res2 >= 0); // errno code semantic + assert(event.res2 >= 0); assert(event.res == -1 || event.res2 == 0); // Set result indicators - request.retval = event.res; - request.errcode = event.res2; + request.retval = std::max(event.res, -1LL); + request.errcode = event.res >= -1? event.res2 : std::abs(event.res); if(likely(request.waiter && request.waiter != ctx::current)) ctx::notify(*request.waiter); + /* - log::debug("AIO request(%p) fd:%d op:%d bytes:%lu off:%ld prio:%d ctx:%p result: bytes:%ld errno:%ld", - request, - request->aio_fildes, - request->aio_lio_opcode, - request->aio_nbytes, - request->aio_offset, - request->aio_reqprio, - request->waiter, - request->retval, - request->errcode); + log::debug + { + "AIO request(%p) fd:%d op:%d bytes:%lu off:%ld prio:%d ctx:%p result: bytes:%ld errno:%ld", + request, + request->aio_fildes, + request->aio_lio_opcode, + request->aio_nbytes, + request->aio_offset, + request->aio_reqprio, + request->waiter, + request->retval, + request->errcode + }; */ } catch(const std::exception &e) @@ -246,7 +245,7 @@ try { ctx::wait(); } - while(retval == -2); + while(retval == std::numeric_limits::min()); if(retval == -1) throw_system_error(errcode); diff --git a/ircd/aio.h b/ircd/aio.h index e1fd8ce17..e060d52fe 100644 --- a/ircd/aio.h +++ b/ircd/aio.h @@ -60,7 +60,7 @@ struct ircd::fs::aio::request struct read; struct write; - ssize_t retval {-2}; + ssize_t retval {std::numeric_limits::min()}; ssize_t errcode {0}; ctx::ctx *waiter {ctx::current};