diff options
-rw-r--r-- | ChangeLog | 10 | ||||
-rw-r--r-- | rt/aio_misc.c | 4 | ||||
-rw-r--r-- | rt/lio_listio.c | 5 | ||||
-rw-r--r-- | rt/tst-aio.c | 82 | ||||
-rw-r--r-- | test-skeleton.c | 5 |
5 files changed, 82 insertions, 24 deletions
@@ -1,5 +1,15 @@ 1998-04-11 Ulrich Drepper <drepper@cygnus.com> + * rt/tst-aio.c: Add test for aio_read and lio_listio. + + * rt/lio_listio.c: Correct total counter handling. + + * rt/aio_misc.c (handle_fildes_io): Correctly dequeue elements + from request queue. + + * test-skeleton.c (main): Make stdout unbuffered. Improve message + of signal on exit even more. + * rt/aio_suspend.c (aio_suspend): Use PTHREAD_COND_INITIALIZER instead of call to pthread_cond_init. * rt/lio_listio.c (lio_listio): Likewise. 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; } diff --git a/test-skeleton.c b/test-skeleton.c index 39c6073..497adbe 100644 --- a/test-skeleton.c +++ b/test-skeleton.c @@ -155,6 +155,9 @@ main (int argc, char *argv[]) test_dir = "/tmp"; } + /* Make sure we see all message, even those on stdout. */ + setvbuf (stdout, NULL, _IONBF, 0); + /* If we are not expected to fork run the function immediately. */ if (direct) return TEST_FUNCTION; @@ -213,7 +216,7 @@ main (int argc, char *argv[]) fprintf (stderr, "Incorrect signal from child: got `%s', need `%s'\n", strsignal (WTERMSIG (status)), strsignal (EXPECTED_SIGNAL)); else - fprintf (stderr, "Incorrect signal from child: got `%s'\n", + fprintf (stderr, "Didn't expect signal from child: got `%s'\n", strsignal (WTERMSIG (status))); exit (1); } |