Boiled it down to a minimal async I/O reproducer as follows:
#include <stdio.h> #include <unistd.h> #include <sys/mman.h> #include <sys/types.h> #include <sys/stat.h> #include <libaio.h> #include <fcntl.h> #include <err.h>
io_context_t io_ctx;
void do_sync_io(struct iocb *iocb) { struct io_event event; struct iocb *iocbs[] = { iocb }; struct timespec ts = { 30, 0 };
if (io_submit(io_ctx, 1, iocbs) != 1) err(1, "io_submit failed"); if (io_getevents(io_ctx, 0, 1, &event, &ts) != 1) err(1, "io_getevents failed"); }
int main(void) { char *buf; int rwfd, status = 0, res, page_size = getpagesize(); struct iocb iocb;
if (io_queue_init(1024, &io_ctx)) err(1, "io_queue_init failed"); rwfd = open("testfile", O_RDWR | O_CREAT); if (rwfd < 0) err(1, "open failed"); if (ftruncate(rwfd, 512) < 0) err(1, "ftruncate failed"); buf = mmap(0, page_size, PROT_READ | PROT_WRITE, MAP_SHARED, rwfd, 0); if (buf == MAP_FAILED) err(1, "mmap failed");
(void)io_prep_pwrite(&iocb, rwfd, buf, 512, 0); do_sync_io(&iocb);
(void)io_prep_pread(&iocb, rwfd, buf, 512, 0); do_sync_io(&iocb); }
Boiled it down to a minimal async I/O reproducer as follows:
#include <stdio.h>
#include <unistd.h>
#include <sys/mman.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <libaio.h>
#include <fcntl.h>
#include <err.h>
io_context_t io_ctx;
void do_sync_io(struct iocb *iocb)
{
struct io_event event;
struct iocb *iocbs[] = { iocb };
struct timespec ts = { 30, 0 };
if (io_submit(io_ctx, 1, iocbs) != 1)
err(1, "io_submit failed"); io_ctx, 0, 1, &event, &ts) != 1)
err(1, "io_getevents failed");
if (io_getevents(
}
int main(void)
{
char *buf;
int rwfd, status = 0, res, page_size = getpagesize();
struct iocb iocb;
if (io_queue_ init(1024, &io_ctx))
err(1, "io_queue_init failed");
err(1, "open failed");
err(1, "ftruncate failed");
err(1, "mmap failed");
rwfd = open("testfile", O_RDWR | O_CREAT);
if (rwfd < 0)
if (ftruncate(rwfd, 512) < 0)
buf = mmap(0, page_size, PROT_READ | PROT_WRITE, MAP_SHARED, rwfd, 0);
if (buf == MAP_FAILED)
}