|  | #include <aio.h> | 
|  | #include <errno.h> | 
|  | #include <signal.h> | 
|  | #include <stdio.h> | 
|  | #include <stdlib.h> | 
|  | #include <pthread.h> | 
|  | #include <unistd.h> | 
|  |  | 
|  | static pthread_barrier_t b; | 
|  | static pthread_t main_thread; | 
|  | static int flag; | 
|  |  | 
|  |  | 
|  | static void * | 
|  | tf (void *arg) | 
|  | { | 
|  | int e = pthread_barrier_wait (&b); | 
|  | if (e != 0 && e != PTHREAD_BARRIER_SERIAL_THREAD) | 
|  | { | 
|  | puts ("child: barrier_wait failed"); | 
|  | exit (1); | 
|  | } | 
|  |  | 
|  | /* There is unfortunately no other way to try to make sure the other | 
|  | thread reached the aio_suspend call.  This test could fail on | 
|  | highly loaded machines.  */ | 
|  | sleep (2); | 
|  |  | 
|  | pthread_kill (main_thread, SIGUSR1); | 
|  |  | 
|  | while (1) | 
|  | sleep (1000); | 
|  |  | 
|  | return NULL; | 
|  | } | 
|  |  | 
|  |  | 
|  | static void | 
|  | sh (int sig) | 
|  | { | 
|  | flag = 1; | 
|  | } | 
|  |  | 
|  |  | 
|  | static int | 
|  | do_test (void) | 
|  | { | 
|  | main_thread = pthread_self (); | 
|  |  | 
|  | struct sigaction sa; | 
|  |  | 
|  | sa.sa_handler = sh; | 
|  | sa.sa_flags = 0; | 
|  | sigemptyset (&sa.sa_mask); | 
|  |  | 
|  | if (sigaction (SIGUSR1, &sa, NULL) != 0) | 
|  | { | 
|  | puts ("sigaction failed"); | 
|  | return 1; | 
|  | } | 
|  |  | 
|  | if (pthread_barrier_init (&b, NULL, 2) != 0) | 
|  | { | 
|  | puts ("barrier_init"); | 
|  | return 1; | 
|  | } | 
|  |  | 
|  | int fds[2]; | 
|  | if (pipe (fds) != 0) | 
|  | { | 
|  | puts ("pipe failed"); | 
|  | return 1; | 
|  | } | 
|  |  | 
|  | char buf[42]; | 
|  | struct aiocb req; | 
|  | req.aio_fildes = fds[0]; | 
|  | req.aio_lio_opcode = LIO_READ; | 
|  | req.aio_reqprio = 0; | 
|  | req.aio_offset = 0; | 
|  | req.aio_buf = buf; | 
|  | req.aio_nbytes = sizeof (buf); | 
|  | req.aio_sigevent.sigev_notify = SIGEV_NONE; | 
|  |  | 
|  | pthread_t th; | 
|  | if (pthread_create (&th, NULL, tf, NULL) != 0) | 
|  | { | 
|  | puts ("create failed"); | 
|  | return 1; | 
|  | } | 
|  |  | 
|  | int e = pthread_barrier_wait (&b); | 
|  | if (e != 0 && e != PTHREAD_BARRIER_SERIAL_THREAD) | 
|  | { | 
|  | puts ("parent: barrier_wait failed"); | 
|  | exit (1); | 
|  | } | 
|  |  | 
|  | struct aiocb *list[1]; | 
|  | list[0] = &req; | 
|  |  | 
|  | e = lio_listio (LIO_WAIT, list, 1, NULL); | 
|  | if (e != -1) | 
|  | { | 
|  | puts ("lio_listio succeeded"); | 
|  | return 1; | 
|  | } | 
|  | if (errno != EINTR) | 
|  | { | 
|  | printf ("lio_listio did not return EINTR: %d (%d = %m)\n", e, errno); | 
|  | return 1; | 
|  | } | 
|  |  | 
|  | return 0; | 
|  | } | 
|  |  | 
|  | #define TEST_FUNCTION do_test () | 
|  | #define TIMEOUT 5 | 
|  | #include "../test-skeleton.c" |