Back to index

glibc  2.9
Defines | Functions | Variables
tst-aio5.c File Reference
#include <aio.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include "../test-skeleton.c"

Go to the source code of this file.

Defines

#define TIMEOUT   10 /* sec */
#define MY_SIVAL   27

Functions

static void callback (sigval_t s)
static int wait_flag (void)
static int do_test (int argc, char *argv[])

Variables

volatile sig_atomic_t flag

Define Documentation

#define MY_SIVAL   27

Definition at line 30 of file tst-aio5.c.

#define TIMEOUT   10 /* sec */

Definition at line 28 of file tst-aio5.c.


Function Documentation

static void callback ( sigval_t  s) [static]

Definition at line 36 of file tst-aio5.c.

{
  flag = s.sival_int;
}

Here is the caller graph for this function:

static int do_test ( int  argc,
char *  argv[] 
) [static]

Definition at line 61 of file tst-aio5.c.

{
  char name[] = "/tmp/aio5.XXXXXX";
  int fd;
  struct aiocb *arr[1];
  struct aiocb cb;
  static const char buf[] = "Hello World\n";
  struct sigevent ev;

  fd = mkstemp (name);
  if (fd == -1)
    {
      printf ("cannot open temp name: %m\n");
      return 1;
    }

  unlink (name);

  arr[0] = &cb;

  cb.aio_fildes = fd;
  cb.aio_lio_opcode = LIO_WRITE;
  cb.aio_reqprio = 0;
  cb.aio_buf = (void *) buf;
  cb.aio_nbytes = sizeof (buf) - 1;
  cb.aio_offset = 0;
  cb.aio_sigevent.sigev_notify = SIGEV_THREAD;
  cb.aio_sigevent.sigev_notify_function = callback;
  cb.aio_sigevent.sigev_notify_attributes = NULL;
  cb.aio_sigevent.sigev_value.sival_int = MY_SIVAL;

  ev.sigev_notify = SIGEV_THREAD;
  ev.sigev_notify_function = callback;
  ev.sigev_notify_attributes = NULL;
  ev.sigev_value.sival_int = MY_SIVAL;

  /* First use aio_write.  */
  if (aio_write (arr[0]) < 0)
    {
      if (errno == ENOSYS)
       {
         puts ("no aio support in this configuration");
         return 0;
       }
      printf ("aio_write failed: %m\n");
      return 1;
    }

  if (wait_flag ())
    return 1;

  puts ("aio_write OK");

  flag = 0;
  /* Again with lio_listio.  */
  if (lio_listio (LIO_NOWAIT, arr, 1, &ev) < 0)
    {
      printf ("lio_listio failed: %m\n");
      return 1;
    }

  if (wait_flag ())
    return 1;

  puts ("all OK");

  return 0;
}

Here is the call graph for this function:

static int wait_flag ( void  ) [static]

Definition at line 42 of file tst-aio5.c.

{
  while (flag == 0)
    {
      puts ("Sleeping...");
      sleep (1);
    }

  if (flag != MY_SIVAL)
    {
      printf ("signal handler received wrong signal, flag is %d\n", flag);
      return 1;
    }

  return 0;
}

Here is the call graph for this function:

Here is the caller graph for this function:


Variable Documentation

volatile sig_atomic_t flag

Definition at line 32 of file tst-aio5.c.