#include <semaphore.h>
#include <stdio.h>
#include <unistd.h>
#include <pthread.h>
#include <internaltypes.h>

#ifndef SEM_WAIT
# define SEM_WAIT(s) sem_wait (s)
#endif

static void *
tf (void *arg)
{
#ifdef PREPARE
  PREPARE
#endif
  SEM_WAIT (arg);
  return NULL;
}

int
main (void)
{
  int tries = 5;
  pthread_t th;
  union
  {
    sem_t s;
    struct new_sem ns;
  } u;
 again:
  if (sem_init (&u.s, 0, 0) != 0)
    {
      puts ("sem_init failed");
      return 1;
    }

  if (u.ns.nwaiters != 0)
    {
      puts ("nwaiters not initialized");
      return 1;
    }

  if (pthread_create (&th, NULL, tf, &u.s) != 0)
    {
      puts ("pthread_create failed");
      return 1;
    }

  sleep (1);

  if (pthread_cancel (th) != 0)
    {
      puts ("pthread_cancel failed");
      return 1;
    }

  void *r;
  if (pthread_join (th, &r) != 0)
    {
      puts ("pthread_join failed");
      return 1;
    }
  if (r != PTHREAD_CANCELED && --tries > 0)
    {
      /* Maybe we get the scheduling right the next time.  */
      sem_destroy (&u.s);
      goto again;
    }

  if (u.ns.nwaiters != 0)
    {
      puts ("nwaiters not reset");
      return 1;
    }

  return 0;
}
