diff --git a/adb/daemon/usb.cpp b/adb/daemon/usb.cpp index 87ed3db67..20fb6a3d1 100644 --- a/adb/daemon/usb.cpp +++ b/adb/daemon/usb.cpp @@ -317,6 +317,8 @@ bool init_functionfs(struct usb_handle* h) { goto err; } + memset(&h->read_aiob.ctx, 0, sizeof(h->read_aiob.ctx)); + memset(&h->write_aiob.ctx, 0, sizeof(h->write_aiob.ctx)); if (io_setup(USB_FFS_NUM_BUFS, &h->read_aiob.ctx) || io_setup(USB_FFS_NUM_BUFS, &h->write_aiob.ctx)) { D("[ aio: got error on io_setup (%d) ]", errno); diff --git a/libasyncio/AsyncIO.cpp b/libasyncio/AsyncIO.cpp index 7430bc81e..6149f09d1 100644 --- a/libasyncio/AsyncIO.cpp +++ b/libasyncio/AsyncIO.cpp @@ -17,9 +17,10 @@ #include #include #include +#include +#include int io_setup(unsigned nr, aio_context_t* ctxp) { - memset(ctxp, 0, sizeof(*ctxp)); return syscall(__NR_io_setup, nr, ctxp); } @@ -48,3 +49,11 @@ void io_prep(iocb* iocb, int fd, const void* buf, uint64_t count, int64_t offset iocb->aio_nbytes = count; iocb->aio_offset = offset; } + +void io_prep_pread(struct iocb* iocb, int fd, void* buf, size_t count, long long offset) { + io_prep(iocb, fd, buf, count, offset, true); +} + +void io_prep_pwrite(struct iocb* iocb, int fd, void* buf, size_t count, long long offset) { + io_prep(iocb, fd, buf, count, offset, false); +} diff --git a/libasyncio/include/asyncio/AsyncIO.h b/libasyncio/include/asyncio/AsyncIO.h index e3fb93a4d..9620d2a84 100644 --- a/libasyncio/include/asyncio/AsyncIO.h +++ b/libasyncio/include/asyncio/AsyncIO.h @@ -17,9 +17,9 @@ #ifndef _ASYNCIO_H #define _ASYNCIO_H -#include -#include #include +#include +#include #include #include #include @@ -35,10 +35,14 @@ extern "C" { int io_setup(unsigned nr, aio_context_t* ctxp); int io_destroy(aio_context_t ctx); -int io_submit(aio_context_t ctx, long nr, iocb** iocbpp); -int io_getevents(aio_context_t ctx, long min_nr, long max_nr, io_event* events, timespec* timeout); -int io_cancel(aio_context_t ctx, iocb*, io_event* result); -void io_prep(iocb* iocb, int fd, const void* buf, uint64_t count, int64_t offset, bool read); +int io_submit(aio_context_t ctx, long nr, struct iocb** iocbpp); +int io_getevents(aio_context_t ctx, long min_nr, long max_nr, struct io_event* events, + struct timespec* timeout); +int io_cancel(aio_context_t ctx, struct iocb*, struct io_event* result); + +void io_prep_pread(struct iocb* iocb, int fd, void* buf, size_t count, long long offset); +void io_prep_pwrite(struct iocb* iocb, int fd, void* buf, size_t count, long long offset); +void io_prep(struct iocb* iocb, int fd, const void* buf, uint64_t count, int64_t offset, bool read); #ifdef __cplusplus };