diff options
author | Ulrich Drepper <drepper@redhat.com> | 2004-12-22 20:10:10 +0000 |
---|---|---|
committer | Ulrich Drepper <drepper@redhat.com> | 2004-12-22 20:10:10 +0000 |
commit | a334319f6530564d22e775935d9c91663623a1b4 (patch) | |
tree | b5877475619e4c938e98757d518bb1e9cbead751 /rtkaio/tst-aiod.c | |
parent | 0ecb606cb6cf65de1d9fc8a919bceb4be476c602 (diff) | |
download | glibc-a334319f6530564d22e775935d9c91663623a1b4.tar.gz |
(CFLAGS-tst-align.c): Add -mpreferred-stack-boundary=4.
Diffstat (limited to 'rtkaio/tst-aiod.c')
-rw-r--r-- | rtkaio/tst-aiod.c | 307 |
1 files changed, 0 insertions, 307 deletions
diff --git a/rtkaio/tst-aiod.c b/rtkaio/tst-aiod.c deleted file mode 100644 index a8b58106dc..0000000000 --- a/rtkaio/tst-aiod.c +++ /dev/null @@ -1,307 +0,0 @@ -/* Tests for AIO in librt. - Copyright (C) 1998, 2000, 2002, 2006 Free Software Foundation, Inc. - This file is part of the GNU C Library. - Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, write to the Free - Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA - 02111-1307 USA. */ - -#include <aio.h> -#include <errno.h> -#include <error.h> -#include <stdlib.h> -#include <string.h> -#include <unistd.h> -#include <sys/stat.h> -#include "tst-aiod.h" - - -/* Prototype for our test function. */ -extern void do_prepare (int argc, char *argv[]); -extern int do_test (int argc, char *argv[]); - -/* We have a preparation function. */ -#define PREPARE do_prepare - -/* We might need a bit longer timeout. */ -#define TIMEOUT 20 /* sec */ - -/* This defines the `main' function and some more. */ -#include <test-skeleton.c> - - -/* These are for the temporary file we generate. */ -char *name; -int fd; -char *tmpbuf; -int blksz = 100; - -void -do_prepare (int argc, char *argv[]) -{ - size_t name_len; - - name_len = strlen (test_dir); - name = malloc (name_len + sizeof ("/aioXXXXXX")); - mempcpy (mempcpy (name, test_dir, name_len), - "/aioXXXXXX", sizeof ("/aioXXXXXX")); - add_temp_file (name); - - /* Open our test file. */ - fd = mkstemp (name); - if (fd == -1) - error (EXIT_FAILURE, errno, "cannot open test file `%s'", name); - - int sz = set_o_direct (fd); - if (sz != -1) - { - blksz = sz; - printf ("Using O_DIRECT with block size %d\n", blksz); - } -} - - -static int -test_file (const void *buf, size_t size, int fd, const char *msg) -{ - struct stat st; - char *tmp = tmpbuf; - - errno = 0; - if (fstat (fd, &st) < 0) - { - error (0, errno, "%s: failed stat", msg); - return 1; - } - - if (st.st_size != (off_t) size) - { - error (0, errno, "%s: wrong size: %lu, should be %lu", - msg, (unsigned long int) st.st_size, (unsigned long int) size); - return 1; - } - - if (pread (fd, tmp, size, 0) != (ssize_t) size) - { - error (0, errno, "%s: failed pread", msg); - return 1; - } - - if (memcmp (buf, tmp, size) != 0) - { - error (0, errno, "%s: failed comparison", msg); - return 1; - } - - printf ("%s test ok\n", msg); - - return 0; -} - - -static int -do_wait (struct aiocb **cbp, size_t nent, int allowed_err) -{ - int go_on; - size_t cnt; - int result = 0; - - do - { - aio_suspend ((const struct aiocb *const *) cbp, nent, NULL); - go_on = 0; - for (cnt = 0; cnt < nent; ++cnt) - if (cbp[cnt] != NULL) - { - if (aio_error (cbp[cnt]) == EINPROGRESS) - go_on = 1; - else - { - if (aio_return (cbp[cnt]) == -1 - && (allowed_err == 0 - || aio_error (cbp[cnt]) != allowed_err)) - { - error (0, aio_error (cbp[cnt]), "Operation failed\n"); - result = 1; - } - cbp[cnt] = NULL; - } - } - } - while (go_on); - - return result; -} - - -int -do_test (int argc, char *argv[]) -{ - struct aiocb cbs[10]; - struct aiocb cbs_fsync; - struct aiocb *cbp[10]; - struct aiocb *cbp_fsync[1]; - char *buf; - size_t cnt; - int result = 0; - - buf = mmap (NULL, 20 * blksz, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANON, -1, 0); - tmpbuf = buf + 10 * blksz; - if (buf == MAP_FAILED) - { - error (0, errno, "mmap failed"); - return 1; - } - - /* Preparation. */ - for (cnt = 0; cnt < 10; ++cnt) - { - cbs[cnt].aio_fildes = fd; - cbs[cnt].aio_reqprio = 0; - cbs[cnt].aio_buf = memset (&buf[cnt * blksz], '0' + cnt, blksz); - cbs[cnt].aio_nbytes = blksz; - cbs[cnt].aio_offset = cnt * blksz; - cbs[cnt].aio_sigevent.sigev_notify = SIGEV_NONE; - - cbp[cnt] = &cbs[cnt]; - } - - /* First a simple test. */ - for (cnt = 10; cnt > 0; ) - if (aio_write (cbp[--cnt]) < 0 && errno == ENOSYS) - { - error (0, 0, "no aio support in this configuration"); - return 0; - } - /* Wait 'til the results are there. */ - result |= do_wait (cbp, 10, 0); - /* Test this. */ - result |= test_file (buf, 10 * blksz, fd, "aio_write"); - - /* Read now as we've written it. */ - memset (buf, '\0', 10 * blksz); - /* Issue the commands. */ - for (cnt = 10; cnt > 0; ) - { - --cnt; - cbp[cnt] = &cbs[cnt]; - aio_read (cbp[cnt]); - } - /* Wait 'til the results are there. */ - result |= do_wait (cbp, 10, 0); - /* Test this. */ - for (cnt = 0; cnt < 10 * blksz; ++cnt) - if (buf[cnt] != '0' + (cnt / blksz)) - { - result = 1; - error (0, 0, "comparison failed for aio_read test"); - break; - } - - if (cnt == 10 * blksz) - 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, 10 * blksz, fd, "lio_listio (write)"); - - /* Test aio_fsync. */ - cbs_fsync.aio_fildes = fd; - cbs_fsync.aio_sigevent.sigev_notify = SIGEV_NONE; - cbp_fsync[0] = &cbs_fsync; - - /* Remove the test file contents first. */ - if (ftruncate (fd, 0) < 0) - { - error (0, errno, "ftruncate failed\n"); - result = 1; - } - - /* Write again. */ - for (cnt = 10; cnt > 0; ) - aio_write (cbp[--cnt]); - - if (aio_fsync (O_SYNC, &cbs_fsync) < 0) - { - error (0, errno, "aio_fsync failed\n"); - result = 1; - } - result |= do_wait (cbp_fsync, 1, 0); - - /* ...and test since all data should be on disk now. */ - result |= test_file (buf, 10 * blksz, fd, "aio_fsync (aio_write)"); - - /* Test aio_cancel. */ - /* Remove the test file contents first. */ - if (ftruncate (fd, 0) < 0) - { - error (0, errno, "ftruncate failed\n"); - result = 1; - } - - /* Write again. */ - for (cnt = 10; cnt > 0; ) - aio_write (cbp[--cnt]); - - /* Cancel all requests. */ - if (aio_cancel (fd, NULL) == -1) - printf ("aio_cancel (fd, NULL) cannot cancel anything\n"); - - result |= do_wait (cbp, 10, ECANCELED); - - /* Another test for aio_cancel. */ - /* Remove the test file contents first. */ - if (ftruncate (fd, 0) < 0) - { - error (0, errno, "ftruncate failed\n"); - result = 1; - } - - /* Write again. */ - for (cnt = 10; cnt > 0; ) - { - --cnt; - cbp[cnt] = &cbs[cnt]; - aio_write (cbp[cnt]); - } - puts ("finished3"); - - /* Cancel all requests. */ - for (cnt = 10; cnt > 0; ) - if (aio_cancel (fd, cbp[--cnt]) == -1) - /* This is not an error. The request can simply be finished. */ - printf ("aio_cancel (fd, cbp[%Zd]) cannot be canceled\n", cnt); - puts ("finished2"); - - result |= do_wait (cbp, 10, ECANCELED); - - puts ("finished"); - - return result; -} |