blob: 19149154b5bffcbfb1d34d3fe3ce0248c39f7c71 [file] [log] [blame]
#include <time.h>
io_context_t io_ctx;
#define BAD_CTX ((io_context_t)-1)
void aio_setup(int n)
{
int res = io_queue_init(n, &io_ctx);
if (res != 0) {
printf("io_queue_setup(%d) returned %d (%s)\n",
n, res, strerror(-res));
exit(3);
}
}
int attempt_io_submit(io_context_t ctx, long nr, struct iocb *ios[], int expect)
{
int res;
printf("expect %3d: io_submit(%10p, %3ld, %10p) = ", expect, ctx, nr, ios);
fflush(stdout);
res = io_submit(ctx, nr, ios);
printf("%3d [%s]%s\n", res, (res <= 0) ? strerror(-res) : "",
(res != expect) ? " -- FAILED" : "");
if (res != expect)
return 1;
return 0;
}
int sync_submit(struct iocb *iocb)
{
struct io_event event;
struct iocb *iocbs[] = { iocb };
int res;
/* 30 second timeout should be enough */
struct timespec ts;
ts.tv_sec = 30;
ts.tv_nsec = 0;
res = io_submit(io_ctx, 1, iocbs);
if (res != 1) {
printf("sync_submit: io_submit res=%d [%s]\n", res, strerror(-res));
return res;
}
res = io_getevents(io_ctx, 0, 1, &event, &ts);
if (res != 1) {
printf("sync_submit: io_getevents res=%d [%s]\n", res, strerror(-res));
return res;
}
return event.res;
}
#define SETUP aio_setup(1024)
#define READ 'r'
#define WRITE 'w'
#define READ_SILENT 'R'
#define WRITE_SILENT 'W'
#define READV '<'
#define WRITEV '>'
int attempt_rw(int fd, void *buf, int count, long long pos, int rw, int expect)
{
struct iocb iocb;
int res;
int silent = 0;
switch(rw) {
case READ_SILENT:
silent = 1;
case READ:
io_prep_pread (&iocb, fd, buf, count, pos);
break;
case WRITE_SILENT:
silent = 1;
case WRITE:
io_prep_pwrite(&iocb, fd, buf, count, pos);
break;
case WRITEV:
io_prep_pwritev(&iocb, fd, buf, count, pos);
break;
case READV:
io_prep_preadv(&iocb, fd, buf, count, pos);
break;
}
if (!silent) {
printf("expect %5d: (%c), res = ", expect, rw);
fflush(stdout);
}
res = sync_submit(&iocb);
if (!silent || res != expect) {
if (silent)
printf("expect %5d: (%c), res = ", expect, rw);
printf("%5d [%s]%s\n", res,
(res <= 0) ? strerror(-res) : "Success",
(res != expect) ? " -- FAILED" : "");
}
if (res != expect)
return 1;
return 0;
}