diff options
Diffstat (limited to 'rt')
-rw-r--r-- | rt/aio_misc.c | 4 | ||||
-rw-r--r-- | rt/lio_listio.c | 5 | ||||
-rw-r--r-- | rt/tst-aio.c | 82 |
3 files changed, 68 insertions, 23 deletions
diff --git a/rt/aio_misc.c b/rt/aio_misc.c index 030bef9..ca8f4de 100644 --- a/rt/aio_misc.c +++ b/rt/aio_misc.c @@ -476,6 +476,8 @@ handle_fildes_io (void *arg) runp->next_fd->last_fd = runp->last_fd; if (runp->last_fd != NULL) runp->last_fd->next_fd = runp->next_fd; + else + requests = runp->next_fd; } else { @@ -486,6 +488,8 @@ handle_fildes_io (void *arg) runp->next_fd->last_fd = runp->next_prio; if (runp->last_fd != NULL) runp->last_fd->next_fd = runp->next_prio; + else + requests = runp->next_prio; } /* Free the old element. */ diff --git a/rt/lio_listio.c b/rt/lio_listio.c index e4d9729..03c3bf2 100644 --- a/rt/lio_listio.c +++ b/rt/lio_listio.c @@ -93,7 +93,7 @@ lio_listio (mode, list, nent, sig) { waitlist[cnt].cond = &cond; waitlist[cnt].next = requests[cnt]->waiting; - waitlist[cnt].counterp = NULL; + waitlist[cnt].counterp = &total; waitlist[cnt].sigevp = NULL; requests[cnt]->waiting = &waitlist[cnt]; ++total; @@ -105,8 +105,7 @@ lio_listio (mode, list, nent, sig) pthread_setcancelstate (PTHREAD_CANCEL_DISABLE, &oldstate); while (total > 0) - if (pthread_cond_wait (&cond, &__aio_requests_mutex) == 0) - --total; + pthread_cond_wait (&cond, &__aio_requests_mutex); /* Now it's time to restore the cancelation state. */ pthread_setcancelstate (oldstate, NULL); diff --git a/rt/tst-aio.c b/rt/tst-aio.c index e319dea..83833ee 100644 --- a/rt/tst-aio.c +++ b/rt/tst-aio.c @@ -69,16 +69,32 @@ test_file (const void *buf, size_t size, int fd, const char *msg) return 1; } - if (ftruncate (fd, 0) < 0) - { - error (0, errno, "%s: failed truncate", msg); - return 1; - } + printf ("%s test ok\n", msg); return 0; } +void +do_wait (struct aiocb **cbp, size_t nent) +{ + int go_on; + do + { + size_t cnt; + + aio_suspend ((const struct aiocb *const *) cbp, nent, NULL); + go_on = 0; + for (cnt = 0; cnt < nent; ++cnt) + if (cbp[cnt] != NULL && aio_error (cbp[cnt]) == EINPROGRESS) + go_on = 1; + else + cbp[cnt] = NULL; + } + while (go_on); +} + + int do_test (int argc, char *argv[]) { @@ -90,7 +106,6 @@ do_test (int argc, char *argv[]) size_t cnt; int fd; int result = 0; - int go_on; name_len = strlen (test_dir); name = malloc (name_len + sizeof ("/aioXXXXXX")); @@ -120,23 +135,50 @@ do_test (int argc, char *argv[]) for (cnt = 10; cnt > 0; ) aio_write (cbp[--cnt]); /* Wait 'til the results are there. */ - do + do_wait (cbp, 10); + /* Test this. */ + result |= test_file (buf, sizeof (buf), fd, "aio_write"); + + /* Read now as we've written it. */ + memset (buf, '\0', sizeof (buf)); + /* Issue the commands. */ + for (cnt = 10; cnt > 0; ) { - aio_suspend ((const struct aiocb *const *) cbp, 10, NULL); - go_on = 0; - for (cnt = 0; cnt < 10; ++cnt) - if (cbp[cnt] != NULL && aio_error (cbp[cnt]) == EINPROGRESS) - go_on = 1; - else - { - if (cbp[cnt] != NULL) - printf ("request %d finished\n", cnt); - cbp[cnt] = NULL; - } + --cnt; + cbp[cnt] = &cbs[cnt]; + aio_read (cbp[cnt]); } - while (go_on); + /* Wait 'til the results are there. */ + do_wait (cbp, 10); /* Test this. */ - result |= test_file (buf, sizeof (buf), fd, "aio_write"); + for (cnt = 0; cnt < 1000; ++cnt) + if (buf[cnt] != '0' + (cnt / 100)) + { + result = 1; + error (0, 0, "comparison failed for aio_read test"); + break; + } + + if (cnt == 1000) + puts ("aio_read test ok"); + + /* Remove the test file contents. */ + if (ftruncate (fd, 0) < 0) + { + error (0, errno, "ftruncate failed\n"); + result = 1; + } + + /* Test lio_listio. */ + for (cnt = 0; cnt < 10; ++cnt) + { + cbs[cnt].aio_lio_opcode = LIO_WRITE; + cbp[cnt] = &cbs[cnt]; + } + /* Issue the command. */ + lio_listio (LIO_WAIT, cbp, 10, NULL); + /* ...and immediately test it since we started it in wait mode. */ + result |= test_file (buf, sizeof (buf), fd, "lio_listio (write)"); return result; } |