Back to index

glibc  2.9
Defines | Functions | Variables
ex14.c File Reference
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "../test-skeleton.c"

Go to the source code of this file.

Defines

#define NTHREADS   20
#define ROUNDS   20
#define TEST_FUNCTION   do_test ()
#define TIMEOUT   60

Functions

static void * worker (void *arg)
static int do_test (void)

Variables

static pthread_barrier_t barriers [NTHREADS]
static pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER
static int counters [NTHREADS]
static int serial [NTHREADS]

Define Documentation

#define NTHREADS   20

Definition at line 8 of file ex14.c.

#define ROUNDS   20

Definition at line 10 of file ex14.c.

#define TEST_FUNCTION   do_test ()

Definition at line 93 of file ex14.c.

#define TIMEOUT   60

Definition at line 94 of file ex14.c.


Function Documentation

static int do_test ( void  ) [static]

Definition at line 96 of file ex14.c.

{
  pthread_t threads[NTHREADS];
  int i;
  void *res;
  int result = 0;

  /* Initialized the barrier variables.  */
  for (i = 0; i < NTHREADS; ++i)
    if (pthread_barrier_init (&barriers[i], NULL, i + 1) != 0)
      {
       printf ("Failed to initialize barrier %d\n", i);
       exit (1);
      }

  /* Start the threads.  */
  for (i = 0; i < NTHREADS; ++i)
    if (pthread_create (&threads[i], NULL, worker, (void *) (long int) i) != 0)
      {
       printf ("Failed to start thread %d\n", i);
       exit (1);
      }

  /* And wait for them.  */
  for (i = 0; i < NTHREADS; ++i)
    if (pthread_join (threads[i], &res) != 0 || res != NULL)
      {
       printf ("thread %d returned a failure\n", i);
       result = 1;
      }

  if (result == 0)
    puts ("all OK");

  return result;
}

Here is the call graph for this function:

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

Definition at line 19 of file ex14.c.

{
  void *result = NULL;
  int nr = (long int) arg;
  int i;

  for (i = 0; i < ROUNDS; ++i)
    {
      int j;
      int retval;

      if (nr == 0)
       {
         memset (counters, '\0', sizeof (counters));
         memset (serial, '\0', sizeof (serial));
       }

      retval = pthread_barrier_wait (&barriers[NTHREADS - 1]);
      if (retval != 0 && retval != PTHREAD_BARRIER_SERIAL_THREAD)
       {
         printf ("thread %d failed to wait for all the others\n", nr);
         result = (void *) 1;
       }

      for (j = nr; j < NTHREADS; ++j)
       {
         /* Increment the counter for this round.  */
         pthread_mutex_lock (&lock);
         ++counters[j];
         pthread_mutex_unlock (&lock);

         /* Wait for the rest.  */
         retval = pthread_barrier_wait (&barriers[j]);

         /* Test the result.  */
         if (nr == 0 && counters[j] != j + 1)
           {
             printf ("barrier in round %d released but count is %d\n",
                    j, counters[j]);
             result = (void *) 1;
           }

         if (retval != 0)
           {
             if (retval != PTHREAD_BARRIER_SERIAL_THREAD)
              {
                printf ("thread %d in round %d has nonzero return value != PTHREAD_BARRIER_SERIAL_THREAD\n",
                       nr, j);
                result = (void *) 1;
              }
             else
              {
                pthread_mutex_lock (&lock);
                ++serial[j];
                pthread_mutex_unlock (&lock);
              }
           }

         /* Wait for the rest again.  */
         retval = pthread_barrier_wait (&barriers[j]);

         /* Now we can check whether exactly one thread was serializing.  */
         if (nr == 0 && serial[j] != 1)
           {
             printf ("not exactly one serial thread in round %d\n", j);
             result = (void *) 1;
           }
       }
    }

  return result;
}

Here is the call graph for this function:

Here is the caller graph for this function:


Variable Documentation

pthread_barrier_t barriers[NTHREADS] [static]

Definition at line 12 of file ex14.c.

int counters[NTHREADS] [static]

Definition at line 15 of file ex14.c.

Definition at line 14 of file ex14.c.

int serial[NTHREADS] [static]

Definition at line 16 of file ex14.c.