#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"
