Back to index

glibc  2.9
Defines | Functions | Variables
tst-cancel4.c File Reference
#include <errno.h>
#include <limits.h>
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/poll.h>
#include <sys/select.h>
#include <sys/uio.h>
#include <sys/wait.h>
#include "../test-skeleton.c"
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Defines

#define WEXITED   0
#define ntest_tf   (sizeof (tests) / sizeof (tests[0]))
#define TIMEOUT   60
#define TEST_FUNCTION   do_test ()

Functions

static void * tf_read (void *arg)
static void * tf_readv (void *arg)
static void * tf_write (void *arg)
static void * tf_writev (void *arg)
static void * tf_sleep (void *arg)
static void * tf_usleep (void *arg)
static void * tf_nanosleep (void *arg)
static void * tf_select (void *arg)
static void * tf_pselect (void *arg)
static void * tf_poll (void *arg)
static void * tf_wait (void *arg)
static void * tf_waitpid (void *arg)
static void * tf_waitid (void *arg)
static int do_test (void)

Variables

static int fds [2]
static pthread_barrier_t b2
struct {
void *(* tf )(void *)
int nb
tests []

Define Documentation

#define ntest_tf   (sizeof (tests) / sizeof (tests[0]))

Definition at line 393 of file tst-cancel4.c.

#define TEST_FUNCTION   do_test ()

Definition at line 468 of file tst-cancel4.c.

#define TIMEOUT   60

Definition at line 467 of file tst-cancel4.c.

#define WEXITED   0

Function Documentation

static int do_test ( void  ) [static]

Definition at line 397 of file tst-cancel4.c.

{
  if (pipe (fds) != 0)
    {
      puts ("pipe failed");
      exit (1);
    }

  int cnt;
  for (cnt = 0; cnt < ntest_tf; ++cnt)
    {
      printf ("round %d\n", cnt);

      if (pthread_barrier_init (&b2, NULL, tests[cnt].nb) != 0)
       {
         puts ("b2 init failed");
         exit (1);
       }

      pthread_t th;
      if (pthread_create (&th, NULL, tests[cnt].tf, NULL) != 0)
       {
         printf ("create for round %d test failed\n", cnt);
         exit (1);
       }

      puts ("barrier waits");

      int r = pthread_barrier_wait (&b2);
      if (r != 0 && r != PTHREAD_BARRIER_SERIAL_THREAD)
       {
         printf ("%s: barrier_wait failed\n", __FUNCTION__);
         exit (1);
       }

      puts ("nanosleep delay");

      struct timespec ts = { .tv_sec = 0, .tv_nsec = 100000000 };
      while (nanosleep (&ts, &ts) != 0)
       continue;

      if (pthread_cancel (th) != 0)
       {
         printf ("cancel in round %d failed\n", cnt);
         exit (1);
       }

      void *status;
      if (pthread_join (th, &status) != 0)
       {
         printf ("join in round %d failed\n", cnt);
         exit (1);
       }
      if (status != PTHREAD_CANCELED)
       {
         printf ("thread in round %d not canceled\n", cnt);
         exit (1);
       }
      printf ("test %d successful\n", cnt);

      if (pthread_barrier_destroy (&b2) != 0)
       {
         puts ("barrier_destroy failed");
         exit (1);
       }
    }

  return 0;
}

Here is the call graph for this function:

static void* tf_nanosleep ( void *  arg) [static]

Definition at line 184 of file tst-cancel4.c.

{
  int r = pthread_barrier_wait (&b2);
  if (r != 0 && r != PTHREAD_BARRIER_SERIAL_THREAD)
    {
      printf ("%s: barrier_wait failed\n", __FUNCTION__);
      exit (1);
    }

  struct timespec ts = { .tv_sec = 10000000, .tv_nsec = 0 };
  while (nanosleep (&ts, &ts) != 0)
    continue;

  printf ("%s: nanosleep returns\n", __FUNCTION__);

  exit (1);
}

Here is the call graph for this function:

static void* tf_poll ( void *  arg) [static]

Definition at line 250 of file tst-cancel4.c.

{
  int r = pthread_barrier_wait (&b2);
  if (r != 0 && r != PTHREAD_BARRIER_SERIAL_THREAD)
    {
      printf ("%s: barrier_wait failed\n", __FUNCTION__);
      exit (1);
    }

  struct pollfd rfs[1] = { [0] = { .fd = fds[0], .events = POLLIN } };

  int s = poll (rfs, 1, -1);

  printf ("%s: poll returns with %d (%s)\n", __FUNCTION__, s,
         strerror (errno));

  exit (1);
}

Here is the call graph for this function:

static void* tf_pselect ( void *  arg) [static]

Definition at line 227 of file tst-cancel4.c.

{
  int r = pthread_barrier_wait (&b2);
  if (r != 0 && r != PTHREAD_BARRIER_SERIAL_THREAD)
    {
      printf ("%s: barrier_wait failed\n", __FUNCTION__);
      exit (1);
    }

  fd_set rfs;
  FD_ZERO (&rfs);
  FD_SET (fds[0], &rfs);

  int s = pselect (fds[0] + 1, &rfs, NULL, NULL, NULL, NULL);

  printf ("%s: pselect returns with %d (%s)\n", __FUNCTION__, s,
         strerror (errno));

  exit (1);
}

Here is the call graph for this function:

static void* tf_read ( void *  arg) [static]

Definition at line 68 of file tst-cancel4.c.

{
  int r = pthread_barrier_wait (&b2);
  if (r != 0 && r != PTHREAD_BARRIER_SERIAL_THREAD)
    {
      printf ("%s: barrier_wait failed\n", __FUNCTION__);
      exit (1);
    }

  char buf[100];
  ssize_t s = read (fds[0], buf, sizeof (buf));

  printf ("%s: read returns with %zd\n", __FUNCTION__, s);

  exit (1);
}

Here is the call graph for this function:

static void* tf_readv ( void *  arg) [static]

Definition at line 87 of file tst-cancel4.c.

{
  int r = pthread_barrier_wait (&b2);
  if (r != 0 && r != PTHREAD_BARRIER_SERIAL_THREAD)
    {
      printf ("%s: barrier_wait failed\n", __FUNCTION__);
      exit (1);
    }

  char buf[100];
  struct iovec iov[1] = { [0] = { .iov_base = buf, .iov_len = sizeof (buf) } };
  ssize_t s = readv (fds[0], iov, 1);

  printf ("%s: readv returns with %zd\n", __FUNCTION__, s);

  exit (1);
}

Here is the call graph for this function:

static void* tf_select ( void *  arg) [static]

Definition at line 204 of file tst-cancel4.c.

{
  int r = pthread_barrier_wait (&b2);
  if (r != 0 && r != PTHREAD_BARRIER_SERIAL_THREAD)
    {
      printf ("%s: barrier_wait failed\n", __FUNCTION__);
      exit (1);
    }

  fd_set rfs;
  FD_ZERO (&rfs);
  FD_SET (fds[0], &rfs);

  int s = select (fds[0] + 1, &rfs, NULL, NULL, NULL);

  printf ("%s: select returns with %d (%s)\n", __FUNCTION__, s,
         strerror (errno));

  exit (1);
}

Here is the call graph for this function:

static void* tf_sleep ( void *  arg) [static]

Definition at line 148 of file tst-cancel4.c.

{
  int r = pthread_barrier_wait (&b2);
  if (r != 0 && r != PTHREAD_BARRIER_SERIAL_THREAD)
    {
      printf ("%s: barrier_wait failed\n", __FUNCTION__);
      exit (1);
    }

  sleep (1000000);

  printf ("%s: sleep returns\n", __FUNCTION__);

  exit (1);
}

Here is the call graph for this function:

static void* tf_usleep ( void *  arg) [static]

Definition at line 166 of file tst-cancel4.c.

{
  int r = pthread_barrier_wait (&b2);
  if (r != 0 && r != PTHREAD_BARRIER_SERIAL_THREAD)
    {
      printf ("%s: barrier_wait failed\n", __FUNCTION__);
      exit (1);
    }

  usleep ((useconds_t) ULONG_MAX);

  printf ("%s: usleep returns\n", __FUNCTION__);

  exit (1);
}

Here is the call graph for this function:

static void* tf_wait ( void *  arg) [static]

Definition at line 271 of file tst-cancel4.c.

{
  int r = pthread_barrier_wait (&b2);
  if (r != 0 && r != PTHREAD_BARRIER_SERIAL_THREAD)
    {
      printf ("%s: barrier_wait failed\n", __FUNCTION__);
      exit (1);
    }

  pid_t pid = fork ();
  if (pid == -1)
    {
      puts ("fork failed");
      exit (1);
    }

  if (pid == 0)
    {
      /* Make the program disappear after a while.  */
      sleep (10);
      exit (0);
    }

  int s = wait (NULL);

  printf ("%s: wait returns with %d (%s)\n", __FUNCTION__, s,
         strerror (errno));

  exit (1);
}

Here is the call graph for this function:

static void* tf_waitid ( void *  arg) [static]

Definition at line 337 of file tst-cancel4.c.

{
  int r = pthread_barrier_wait (&b2);
  if (r != 0 && r != PTHREAD_BARRIER_SERIAL_THREAD)
    {
      printf ("%s: barrier_wait failed\n", __FUNCTION__);
      exit (1);
    }

  pid_t pid = fork ();
  if (pid == -1)
    {
      puts ("fork failed");
      exit (1);
    }

  if (pid == 0)
    {
      /* Make the program disappear after a while.  */
      sleep (10);
      exit (0);
    }

#ifndef WEXITED
# define WEXITED 0
#endif
  siginfo_t si;
  int s = waitid (P_PID, pid, &si, WEXITED);

  printf ("%s: waitid returns with %d (%s)\n", __FUNCTION__, s,
         strerror (errno));

  exit (1);
}

Here is the call graph for this function:

static void* tf_waitpid ( void *  arg) [static]

Definition at line 304 of file tst-cancel4.c.

{
  int r = pthread_barrier_wait (&b2);
  if (r != 0 && r != PTHREAD_BARRIER_SERIAL_THREAD)
    {
      printf ("%s: barrier_wait failed\n", __FUNCTION__);
      exit (1);
    }

  pid_t pid = fork ();
  if (pid == -1)
    {
      puts ("fork failed");
      exit (1);
    }

  if (pid == 0)
    {
      /* Make the program disappear after a while.  */
      sleep (10);
      exit (0);
    }

  int s = waitpid (-1, NULL, 0);

  printf ("%s: waitpid returns with %d (%s)\n", __FUNCTION__, s,
         strerror (errno));

  exit (1);
}

Here is the call graph for this function:

static void* tf_write ( void *  arg) [static]

Definition at line 107 of file tst-cancel4.c.

{
  int r = pthread_barrier_wait (&b2);
  if (r != 0 && r != PTHREAD_BARRIER_SERIAL_THREAD)
    {
      printf ("%s: barrier_wait failed\n", __FUNCTION__);
      exit (1);
    }

  char buf[100000];
  memset (buf, '\0', sizeof (buf));
  ssize_t s = write (fds[1], buf, sizeof (buf));

  printf ("%s: write returns with %zd\n", __FUNCTION__, s);

  exit (1);
}

Here is the call graph for this function:

static void* tf_writev ( void *  arg) [static]

Definition at line 127 of file tst-cancel4.c.

{
  int r = pthread_barrier_wait (&b2);
  if (r != 0 && r != PTHREAD_BARRIER_SERIAL_THREAD)
    {
      printf ("%s: barrier_wait failed\n", __FUNCTION__);
      exit (1);
    }

  char buf[100000];
  memset (buf, '\0', sizeof (buf));
  struct iovec iov[1] = { [0] = { .iov_base = buf, .iov_len = sizeof (buf) } };
  ssize_t s = writev (fds[1], iov, 1);

  printf ("%s: writev returns with %zd\n", __FUNCTION__, s);

  exit (1);
}

Here is the call graph for this function:


Variable Documentation

pthread_barrier_t b2 [static]

Definition at line 64 of file tst-cancel4.c.

int fds[2] [static]

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

struct { ... } tests[] [static]