Blame rt/tst-timer4.c

Packit Service 82fcde
/* Tests for POSIX timer implementation.
Packit Service 82fcde
   Copyright (C) 2004-2018 Free Software Foundation, Inc.
Packit Service 82fcde
   This file is part of the GNU C Library.
Packit Service 82fcde
   Contributed by Jakub Jelinek <jakub@redhat.com>, 2004
Packit Service 82fcde
Packit Service 82fcde
   The GNU C Library is free software; you can redistribute it and/or
Packit Service 82fcde
   modify it under the terms of the GNU Lesser General Public License as
Packit Service 82fcde
   published by the Free Software Foundation; either version 2.1 of the
Packit Service 82fcde
   License, or (at your option) any later version.
Packit Service 82fcde
Packit Service 82fcde
   The GNU C Library is distributed in the hope that it will be useful,
Packit Service 82fcde
   but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service 82fcde
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit Service 82fcde
   Lesser General Public License for more details.
Packit Service 82fcde
Packit Service 82fcde
   You should have received a copy of the GNU Lesser General Public
Packit Service 82fcde
   License along with the GNU C Library; see the file COPYING.LIB.  If
Packit Service 82fcde
   not, see <http://www.gnu.org/licenses/>.  */
Packit Service 82fcde
Packit Service 82fcde
#include <errno.h>
Packit Service 82fcde
#include <signal.h>
Packit Service 82fcde
#include <stdio.h>
Packit Service 82fcde
#include <string.h>
Packit Service 82fcde
#include <time.h>
Packit Service 82fcde
#include <unistd.h>
Packit Service 82fcde
#include <stdint.h>
Packit Service 82fcde
#if _POSIX_THREADS && defined SA_SIGINFO
Packit Service 82fcde
# include <pthread.h>
Packit Service 82fcde
Packit Service 82fcde
# ifndef TEST_CLOCK
Packit Service 82fcde
#  define TEST_CLOCK		CLOCK_REALTIME
Packit Service 82fcde
# endif
Packit Service 82fcde
Packit Service 82fcde
pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;
Packit Service 82fcde
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
Packit Service 82fcde
Packit Service 82fcde
timer_t timer_none, timer_sig1, timer_sig2, timer_thr1, timer_thr2;
Packit Service 82fcde
Packit Service 82fcde
int thr1_cnt, thr1_err;
Packit Service 82fcde
union sigval thr1_sigval;
Packit Service 82fcde
struct timespec thr1_ts;
Packit Service 82fcde
Packit Service 82fcde
static void
Packit Service 82fcde
thr1 (union sigval sigval)
Packit Service 82fcde
{
Packit Service 82fcde
  pthread_mutex_lock (&lock);
Packit Service 82fcde
  thr1_err = clock_gettime (TEST_CLOCK, &thr1_ts);
Packit Service 82fcde
  if (thr1_cnt >= 5)
Packit Service 82fcde
    {
Packit Service 82fcde
      struct itimerspec it = { };
Packit Service 82fcde
      thr1_err |= timer_settime (timer_thr1, 0, &it, NULL);
Packit Service 82fcde
    }
Packit Service 82fcde
  thr1_sigval = sigval;
Packit Service 82fcde
  ++thr1_cnt;
Packit Service 82fcde
  pthread_cond_signal (&cond;;
Packit Service 82fcde
  pthread_mutex_unlock (&lock);
Packit Service 82fcde
}
Packit Service 82fcde
Packit Service 82fcde
int thr2_cnt, thr2_err;
Packit Service 82fcde
union sigval thr2_sigval;
Packit Service 82fcde
size_t thr2_guardsize;
Packit Service 82fcde
struct timespec thr2_ts;
Packit Service 82fcde
Packit Service 82fcde
static void
Packit Service 82fcde
thr2 (union sigval sigval)
Packit Service 82fcde
{
Packit Service 82fcde
  pthread_attr_t nattr;
Packit Service 82fcde
  int err = 0;
Packit Service 82fcde
  size_t guardsize = -1;
Packit Service 82fcde
  int ret = pthread_getattr_np (pthread_self (), &nattr);
Packit Service 82fcde
  if (ret)
Packit Service 82fcde
    {
Packit Service 82fcde
      errno = ret;
Packit Service 82fcde
      printf ("*** pthread_getattr_np failed: %m\n");
Packit Service 82fcde
      err = 1;
Packit Service 82fcde
    }
Packit Service 82fcde
  else
Packit Service 82fcde
    {
Packit Service 82fcde
      ret = pthread_attr_getguardsize (&nattr, &guardsize);
Packit Service 82fcde
      if (ret)
Packit Service 82fcde
        {
Packit Service 82fcde
          errno = ret;
Packit Service 82fcde
          printf ("*** pthread_attr_getguardsize failed: %m\n");
Packit Service 82fcde
          err = 1;
Packit Service 82fcde
        }
Packit Service 82fcde
      if (pthread_attr_destroy (&nattr) != 0)
Packit Service 82fcde
        {
Packit Service 82fcde
          puts ("*** pthread_attr_destroy failed");
Packit Service 82fcde
          err = 1;
Packit Service 82fcde
        }
Packit Service 82fcde
    }
Packit Service 82fcde
  pthread_mutex_lock (&lock);
Packit Service 82fcde
  thr2_err = clock_gettime (TEST_CLOCK, &thr2_ts) | err;
Packit Service 82fcde
  if (thr2_cnt >= 5)
Packit Service 82fcde
    {
Packit Service 82fcde
      struct itimerspec it = { };
Packit Service 82fcde
      thr2_err |= timer_settime (timer_thr2, 0, &it, NULL);
Packit Service 82fcde
    }
Packit Service 82fcde
  thr2_sigval = sigval;
Packit Service 82fcde
  ++thr2_cnt;
Packit Service 82fcde
  thr2_guardsize = guardsize;
Packit Service 82fcde
  pthread_cond_signal (&cond;;
Packit Service 82fcde
  pthread_mutex_unlock (&lock);
Packit Service 82fcde
}
Packit Service 82fcde
Packit Service 82fcde
volatile int sig1_cnt, sig1_err;
Packit Service 82fcde
volatile union sigval sig1_sigval;
Packit Service 82fcde
struct timespec sig1_ts;
Packit Service 82fcde
Packit Service 82fcde
static void
Packit Service 82fcde
sig1_handler (int sig, siginfo_t *info, void *ctx)
Packit Service 82fcde
{
Packit Service 82fcde
  int err = 0;
Packit Service 82fcde
  if (sig != SIGRTMIN) err |= 1 << 0;
Packit Service 82fcde
  if (info->si_signo != SIGRTMIN) err |= 1 << 1;
Packit Service 82fcde
  if (info->si_code != SI_TIMER) err |= 1 << 2;
Packit Service 82fcde
  if (clock_gettime (TEST_CLOCK, &sig1_ts) != 0)
Packit Service 82fcde
    err |= 1 << 3;
Packit Service 82fcde
  if (sig1_cnt >= 5)
Packit Service 82fcde
    {
Packit Service 82fcde
      struct itimerspec it = { };
Packit Service 82fcde
      if (timer_settime (timer_sig1, 0, &it, NULL))
Packit Service 82fcde
	err |= 1 << 4;
Packit Service 82fcde
    }
Packit Service 82fcde
  sig1_err |= err;
Packit Service 82fcde
  sig1_sigval = info->si_value;
Packit Service 82fcde
  ++sig1_cnt;
Packit Service 82fcde
}
Packit Service 82fcde
Packit Service 82fcde
volatile int sig2_cnt, sig2_err;
Packit Service 82fcde
volatile union sigval sig2_sigval;
Packit Service 82fcde
struct timespec sig2_ts;
Packit Service 82fcde
Packit Service 82fcde
static void
Packit Service 82fcde
sig2_handler (int sig, siginfo_t *info, void *ctx)
Packit Service 82fcde
{
Packit Service 82fcde
  int err = 0;
Packit Service 82fcde
  if (sig != SIGRTMIN + 1) err |= 1 << 0;
Packit Service 82fcde
  if (info->si_signo != SIGRTMIN + 1) err |= 1 << 1;
Packit Service 82fcde
  if (info->si_code != SI_TIMER) err |= 1 << 2;
Packit Service 82fcde
  if (clock_gettime (TEST_CLOCK, &sig2_ts) != 0)
Packit Service 82fcde
    err |= 1 << 3;
Packit Service 82fcde
  if (sig2_cnt >= 5)
Packit Service 82fcde
    {
Packit Service 82fcde
      struct itimerspec it = { };
Packit Service 82fcde
      if (timer_settime (timer_sig2, 0, &it, NULL))
Packit Service 82fcde
	err |= 1 << 4;
Packit Service 82fcde
    }
Packit Service 82fcde
  sig2_err |= err;
Packit Service 82fcde
  sig2_sigval = info->si_value;
Packit Service 82fcde
  ++sig2_cnt;
Packit Service 82fcde
}
Packit Service 82fcde
Packit Service 82fcde
/* Check if end is later or equal to start + nsec.  */
Packit Service 82fcde
static int
Packit Service 82fcde
check_ts (const char *name, const struct timespec *start,
Packit Service 82fcde
	  const struct timespec *end, long msec)
Packit Service 82fcde
{
Packit Service 82fcde
  struct timespec ts = *start;
Packit Service 82fcde
Packit Service 82fcde
  ts.tv_sec += msec / 1000000;
Packit Service 82fcde
  ts.tv_nsec += (msec % 1000000) * 1000;
Packit Service 82fcde
  if (ts.tv_nsec >= 1000000000)
Packit Service 82fcde
    {
Packit Service 82fcde
      ++ts.tv_sec;
Packit Service 82fcde
      ts.tv_nsec -= 1000000000;
Packit Service 82fcde
    }
Packit Service 82fcde
  if (end->tv_sec < ts.tv_sec
Packit Service 82fcde
      || (end->tv_sec == ts.tv_sec && end->tv_nsec < ts.tv_nsec))
Packit Service 82fcde
    {
Packit Service 82fcde
      printf ("\
Packit Service 82fcde
*** timer %s invoked too soon: %ld.%09jd instead of expected %ld.%09jd\n",
Packit Service 82fcde
	      name, (long) end->tv_sec, (intmax_t) end->tv_nsec,
Packit Service 82fcde
	      (long) ts.tv_sec, (intmax_t) ts.tv_nsec);
Packit Service 82fcde
      return 1;
Packit Service 82fcde
    }
Packit Service 82fcde
  else
Packit Service 82fcde
    return 0;
Packit Service 82fcde
}
Packit Service 82fcde
Packit Service 82fcde
#define TIMEOUT 15
Packit Service 82fcde
#define TEST_FUNCTION do_test ()
Packit Service 82fcde
static int
Packit Service 82fcde
do_test (void)
Packit Service 82fcde
{
Packit Service 82fcde
  int result = 0;
Packit Service 82fcde
Packit Service 82fcde
#ifdef TEST_CLOCK_MISSING
Packit Service 82fcde
  const char *missing = TEST_CLOCK_MISSING (TEST_CLOCK);
Packit Service 82fcde
  if (missing != NULL)
Packit Service 82fcde
    {
Packit Service 82fcde
      printf ("%s missing, skipping test\n", missing);
Packit Service 82fcde
      return 0;
Packit Service 82fcde
    }
Packit Service 82fcde
#endif
Packit Service 82fcde
Packit Service 82fcde
  struct timespec ts;
Packit Service 82fcde
  if (clock_gettime (TEST_CLOCK, &ts) != 0)
Packit Service 82fcde
    {
Packit Service 82fcde
      printf ("*** clock_gettime failed: %m\n");
Packit Service 82fcde
      result = 1;
Packit Service 82fcde
    }
Packit Service 82fcde
  else
Packit Service 82fcde
    printf ("clock_gettime returned timespec = { %ld, %jd }\n",
Packit Service 82fcde
	    (long) ts.tv_sec, (intmax_t) ts.tv_nsec);
Packit Service 82fcde
Packit Service 82fcde
  if (clock_getres (TEST_CLOCK, &ts) != 0)
Packit Service 82fcde
    {
Packit Service 82fcde
      printf ("*** clock_getres failed: %m\n");
Packit Service 82fcde
      result = 1;
Packit Service 82fcde
    }
Packit Service 82fcde
  else
Packit Service 82fcde
    printf ("clock_getres returned timespec = { %ld, %jd }\n",
Packit Service 82fcde
	    (long) ts.tv_sec, (intmax_t) ts.tv_nsec);
Packit Service 82fcde
Packit Service 82fcde
  struct sigevent ev;
Packit Service 82fcde
  memset (&ev, 0x11, sizeof (ev));
Packit Service 82fcde
  ev.sigev_notify = SIGEV_NONE;
Packit Service 82fcde
  if (timer_create (TEST_CLOCK, &ev, &timer_none) != 0)
Packit Service 82fcde
    {
Packit Service 82fcde
      printf ("*** timer_create for timer_none failed: %m\n");
Packit Service 82fcde
      return 1;
Packit Service 82fcde
    }
Packit Service 82fcde
Packit Service 82fcde
  struct sigaction sa = { .sa_sigaction = sig1_handler,
Packit Service 82fcde
			  .sa_flags = SA_SIGINFO };
Packit Service 82fcde
  sigemptyset (&sa.sa_mask);
Packit Service 82fcde
  sigaction (SIGRTMIN, &sa, NULL);
Packit Service 82fcde
  sa.sa_sigaction = sig2_handler;
Packit Service 82fcde
  sigaction (SIGRTMIN + 1, &sa, NULL);
Packit Service 82fcde
Packit Service 82fcde
  memset (&ev, 0x22, sizeof (ev));
Packit Service 82fcde
  ev.sigev_notify = SIGEV_SIGNAL;
Packit Service 82fcde
  ev.sigev_signo = SIGRTMIN;
Packit Service 82fcde
  ev.sigev_value.sival_ptr = &ev;
Packit Service 82fcde
  if (timer_create (TEST_CLOCK, &ev, &timer_sig1) != 0)
Packit Service 82fcde
    {
Packit Service 82fcde
      printf ("*** timer_create for timer_sig1 failed: %m\n");
Packit Service 82fcde
      return 1;
Packit Service 82fcde
    }
Packit Service 82fcde
Packit Service 82fcde
  memset (&ev, 0x33, sizeof (ev));
Packit Service 82fcde
  ev.sigev_notify = SIGEV_SIGNAL;
Packit Service 82fcde
  ev.sigev_signo = SIGRTMIN + 1;
Packit Service 82fcde
  ev.sigev_value.sival_int = 163;
Packit Service 82fcde
  if (timer_create (TEST_CLOCK, &ev, &timer_sig2) != 0)
Packit Service 82fcde
    {
Packit Service 82fcde
      printf ("*** timer_create for timer_sig2 failed: %m\n");
Packit Service 82fcde
      return 1;
Packit Service 82fcde
    }
Packit Service 82fcde
Packit Service 82fcde
  memset (&ev, 0x44, sizeof (ev));
Packit Service 82fcde
  ev.sigev_notify = SIGEV_THREAD;
Packit Service 82fcde
  ev.sigev_notify_function = thr1;
Packit Service 82fcde
  ev.sigev_notify_attributes = NULL;
Packit Service 82fcde
  ev.sigev_value.sival_ptr = &ev;
Packit Service 82fcde
  if (timer_create (TEST_CLOCK, &ev, &timer_thr1) != 0)
Packit Service 82fcde
    {
Packit Service 82fcde
      printf ("*** timer_create for timer_thr1 failed: %m\n");
Packit Service 82fcde
      return 1;
Packit Service 82fcde
    }
Packit Service 82fcde
Packit Service 82fcde
  pthread_attr_t nattr;
Packit Service 82fcde
  if (pthread_attr_init (&nattr)
Packit Service 82fcde
      || pthread_attr_setguardsize (&nattr, 0))
Packit Service 82fcde
    {
Packit Service 82fcde
      puts ("*** pthread_attr_t setup failed");
Packit Service 82fcde
      result = 1;
Packit Service 82fcde
    }
Packit Service 82fcde
Packit Service 82fcde
  memset (&ev, 0x55, sizeof (ev));
Packit Service 82fcde
  ev.sigev_notify = SIGEV_THREAD;
Packit Service 82fcde
  ev.sigev_notify_function = thr2;
Packit Service 82fcde
  ev.sigev_notify_attributes = &natt;;
Packit Service 82fcde
  ev.sigev_value.sival_int = 111;
Packit Service 82fcde
  if (timer_create (TEST_CLOCK, &ev, &timer_thr2) != 0)
Packit Service 82fcde
    {
Packit Service 82fcde
      printf ("*** timer_create for timer_thr2 failed: %m\n");
Packit Service 82fcde
      return 1;
Packit Service 82fcde
    }
Packit Service 82fcde
Packit Service 82fcde
  int ret = timer_getoverrun (timer_thr1);
Packit Service 82fcde
  if (ret != 0)
Packit Service 82fcde
    {
Packit Service 82fcde
      if (ret == -1)
Packit Service 82fcde
	printf ("*** timer_getoverrun failed: %m\n");
Packit Service 82fcde
      else
Packit Service 82fcde
	printf ("*** timer_getoverrun returned %d != 0\n", ret);
Packit Service 82fcde
      result = 1;
Packit Service 82fcde
    }
Packit Service 82fcde
Packit Service 82fcde
  struct itimerspec it;
Packit Service 82fcde
  it.it_value.tv_sec = 0;
Packit Service 82fcde
  it.it_value.tv_nsec = -26;
Packit Service 82fcde
  it.it_interval.tv_sec = 0;
Packit Service 82fcde
  it.it_interval.tv_nsec = 0;
Packit Service 82fcde
  if (timer_settime (timer_sig1, 0, &it, NULL) == 0)
Packit Service 82fcde
    {
Packit Service 82fcde
      puts ("*** timer_settime with negative tv_nsec unexpectedly succeeded");
Packit Service 82fcde
      result = 1;
Packit Service 82fcde
    }
Packit Service 82fcde
  else if (errno != EINVAL)
Packit Service 82fcde
    {
Packit Service 82fcde
      printf ("*** timer_settime with negative tv_nsec did not fail with "
Packit Service 82fcde
	      "EINVAL: %m\n");
Packit Service 82fcde
      result = 1;
Packit Service 82fcde
    }
Packit Service 82fcde
Packit Service 82fcde
  it.it_value.tv_nsec = 100000;
Packit Service 82fcde
  it.it_interval.tv_nsec = 1000000000;
Packit Service 82fcde
  if (timer_settime (timer_sig2, 0, &it, NULL) == 0)
Packit Service 82fcde
    {
Packit Service 82fcde
      puts ("\
Packit Service 82fcde
*** timer_settime with tv_nsec 1000000000 unexpectedly succeeded");
Packit Service 82fcde
      result = 1;
Packit Service 82fcde
    }
Packit Service 82fcde
  else if (errno != EINVAL)
Packit Service 82fcde
    {
Packit Service 82fcde
      printf ("*** timer_settime with tv_nsec 1000000000 did not fail with "
Packit Service 82fcde
	      "EINVAL: %m\n");
Packit Service 82fcde
      result = 1;
Packit Service 82fcde
    }
Packit Service 82fcde
Packit Service 82fcde
#if 0
Packit Service 82fcde
  it.it_value.tv_nsec = 0;
Packit Service 82fcde
  it.it_interval.tv_nsec = -26;
Packit Service 82fcde
  if (timer_settime (timer_thr1, 0, &it, NULL) != 0)
Packit Service 82fcde
    {
Packit Service 82fcde
      printf ("\
Packit Service 82fcde
!!! timer_settime with it_value 0 it_interval invalid failed: %m\n");
Packit Service 82fcde
      /* FIXME: is this mandated by POSIX?
Packit Service 82fcde
      result = 1; */
Packit Service 82fcde
    }
Packit Service 82fcde
Packit Service 82fcde
  it.it_interval.tv_nsec = 3000000000;
Packit Service 82fcde
  if (timer_settime (timer_thr2, 0, &it, NULL) != 0)
Packit Service 82fcde
    {
Packit Service 82fcde
      printf ("\
Packit Service 82fcde
!!! timer_settime with it_value 0 it_interval invalid failed: %m\n");
Packit Service 82fcde
      /* FIXME: is this mandated by POSIX?
Packit Service 82fcde
      result = 1; */
Packit Service 82fcde
    }
Packit Service 82fcde
#endif
Packit Service 82fcde
Packit Service 82fcde
  struct timespec startts;
Packit Service 82fcde
  if (clock_gettime (TEST_CLOCK, &startts) != 0)
Packit Service 82fcde
    {
Packit Service 82fcde
      printf ("*** clock_gettime failed: %m\n");
Packit Service 82fcde
      result = 1;
Packit Service 82fcde
    }
Packit Service 82fcde
Packit Service 82fcde
  it.it_value.tv_nsec = 100000000;
Packit Service 82fcde
  it.it_interval.tv_nsec = 0;
Packit Service 82fcde
  if (timer_settime (timer_none, 0, &it, NULL) != 0)
Packit Service 82fcde
    {
Packit Service 82fcde
      printf ("*** timer_settime timer_none failed: %m\n");
Packit Service 82fcde
      result = 1;
Packit Service 82fcde
    }
Packit Service 82fcde
Packit Service 82fcde
  it.it_value.tv_nsec = 200000000;
Packit Service 82fcde
  if (timer_settime (timer_thr1, 0, &it, NULL) != 0)
Packit Service 82fcde
    {
Packit Service 82fcde
      printf ("*** timer_settime timer_thr1 failed: %m\n");
Packit Service 82fcde
      result = 1;
Packit Service 82fcde
    }
Packit Service 82fcde
Packit Service 82fcde
  it.it_value.tv_nsec = 300000000;
Packit Service 82fcde
  if (timer_settime (timer_thr2, 0, &it, NULL) != 0)
Packit Service 82fcde
    {
Packit Service 82fcde
      printf ("*** timer_settime timer_thr2 failed: %m\n");
Packit Service 82fcde
      result = 1;
Packit Service 82fcde
    }
Packit Service 82fcde
Packit Service 82fcde
  it.it_value.tv_nsec = 400000000;
Packit Service 82fcde
  if (timer_settime (timer_sig1, 0, &it, NULL) != 0)
Packit Service 82fcde
    {
Packit Service 82fcde
      printf ("*** timer_settime timer_sig1 failed: %m\n");
Packit Service 82fcde
      result = 1;
Packit Service 82fcde
    }
Packit Service 82fcde
Packit Service 82fcde
  it.it_value.tv_nsec = 500000000;
Packit Service 82fcde
  if (TEMP_FAILURE_RETRY (timer_settime (timer_sig2, 0, &it, NULL)) != 0)
Packit Service 82fcde
    {
Packit Service 82fcde
      printf ("*** timer_settime timer_sig2 failed: %m\n");
Packit Service 82fcde
      result = 1;
Packit Service 82fcde
    }
Packit Service 82fcde
Packit Service 82fcde
  pthread_mutex_lock (&lock);
Packit Service 82fcde
  while (thr1_cnt == 0 || thr2_cnt == 0)
Packit Service 82fcde
    pthread_cond_wait (&cond, &lock);
Packit Service 82fcde
  pthread_mutex_unlock (&lock);
Packit Service 82fcde
Packit Service 82fcde
  while (sig1_cnt == 0 || sig2_cnt == 0)
Packit Service 82fcde
    {
Packit Service 82fcde
      ts.tv_sec = 0;
Packit Service 82fcde
      ts.tv_nsec = 100000000;
Packit Service 82fcde
      nanosleep (&ts, NULL);
Packit Service 82fcde
    }
Packit Service 82fcde
Packit Service 82fcde
  pthread_mutex_lock (&lock);
Packit Service 82fcde
Packit Service 82fcde
  if (thr1_cnt != 1)
Packit Service 82fcde
    {
Packit Service 82fcde
      printf ("*** thr1 not called exactly once, but %d times\n", thr1_cnt);
Packit Service 82fcde
      result = 1;
Packit Service 82fcde
    }
Packit Service 82fcde
  else if (thr1_err)
Packit Service 82fcde
    {
Packit Service 82fcde
      puts ("*** an error occurred in thr1");
Packit Service 82fcde
      result = 1;
Packit Service 82fcde
    }
Packit Service 82fcde
  else if (thr1_sigval.sival_ptr != &ev)
Packit Service 82fcde
    {
Packit Service 82fcde
      printf ("*** thr1_sigval.sival_ptr %p != %p\n",
Packit Service 82fcde
	      thr1_sigval.sival_ptr, &ev;;
Packit Service 82fcde
      result = 1;
Packit Service 82fcde
    }
Packit Service 82fcde
  else if (check_ts ("thr1", &startts, &thr1_ts, 200000))
Packit Service 82fcde
    result = 1;
Packit Service 82fcde
Packit Service 82fcde
  if (thr2_cnt != 1)
Packit Service 82fcde
    {
Packit Service 82fcde
      printf ("*** thr2 not called exactly once, but %d times\n", thr2_cnt);
Packit Service 82fcde
      result = 1;
Packit Service 82fcde
    }
Packit Service 82fcde
  else if (thr2_err)
Packit Service 82fcde
    {
Packit Service 82fcde
      puts ("*** an error occurred in thr2");
Packit Service 82fcde
      result = 1;
Packit Service 82fcde
    }
Packit Service 82fcde
  else if (thr2_sigval.sival_int != 111)
Packit Service 82fcde
    {
Packit Service 82fcde
      printf ("*** thr2_sigval.sival_ptr %d != 111\n", thr2_sigval.sival_int);
Packit Service 82fcde
      result = 1;
Packit Service 82fcde
    }
Packit Service 82fcde
  else if (check_ts ("thr2", &startts, &thr2_ts, 300000))
Packit Service 82fcde
    result = 1;
Packit Service 82fcde
  else if (thr2_guardsize != 0)
Packit Service 82fcde
    {
Packit Service 82fcde
      printf ("*** thr2 guardsize %zd != 0\n", thr2_guardsize);
Packit Service 82fcde
      result = 1;
Packit Service 82fcde
    }
Packit Service 82fcde
Packit Service 82fcde
  pthread_mutex_unlock (&lock);
Packit Service 82fcde
Packit Service 82fcde
  if (sig1_cnt != 1)
Packit Service 82fcde
    {
Packit Service 82fcde
      printf ("*** sig1 not called exactly once, but %d times\n", sig1_cnt);
Packit Service 82fcde
      result = 1;
Packit Service 82fcde
    }
Packit Service 82fcde
  else if (sig1_err)
Packit Service 82fcde
    {
Packit Service 82fcde
      printf ("*** errors occurred in sig1 handler %x\n", sig1_err);
Packit Service 82fcde
      result = 1;
Packit Service 82fcde
    }
Packit Service 82fcde
  else if (sig1_sigval.sival_ptr != &ev)
Packit Service 82fcde
    {
Packit Service 82fcde
      printf ("*** sig1_sigval.sival_ptr %p != %p\n",
Packit Service 82fcde
	      sig1_sigval.sival_ptr, &ev;;
Packit Service 82fcde
      result = 1;
Packit Service 82fcde
    }
Packit Service 82fcde
  else if (check_ts ("sig1", &startts, &sig1_ts, 400000))
Packit Service 82fcde
    result = 1;
Packit Service 82fcde
Packit Service 82fcde
  if (sig2_cnt != 1)
Packit Service 82fcde
    {
Packit Service 82fcde
      printf ("*** sig2 not called exactly once, but %d times\n", sig2_cnt);
Packit Service 82fcde
      result = 1;
Packit Service 82fcde
    }
Packit Service 82fcde
  else if (sig2_err)
Packit Service 82fcde
    {
Packit Service 82fcde
      printf ("*** errors occurred in sig2 handler %x\n", sig2_err);
Packit Service 82fcde
      result = 1;
Packit Service 82fcde
    }
Packit Service 82fcde
  else if (sig2_sigval.sival_int != 163)
Packit Service 82fcde
    {
Packit Service 82fcde
      printf ("*** sig2_sigval.sival_ptr %d != 163\n", sig2_sigval.sival_int);
Packit Service 82fcde
      result = 1;
Packit Service 82fcde
    }
Packit Service 82fcde
  else if (check_ts ("sig2", &startts, &sig2_ts, 500000))
Packit Service 82fcde
    result = 1;
Packit Service 82fcde
Packit Service 82fcde
  if (timer_gettime (timer_none, &it) != 0)
Packit Service 82fcde
    {
Packit Service 82fcde
      printf ("*** timer_gettime timer_none failed: %m\n");
Packit Service 82fcde
      result = 1;
Packit Service 82fcde
    }
Packit Service 82fcde
  else if (it.it_value.tv_sec || it.it_value.tv_nsec
Packit Service 82fcde
	   || it.it_interval.tv_sec || it.it_interval.tv_nsec)
Packit Service 82fcde
    {
Packit Service 82fcde
      printf ("\
Packit Service 82fcde
*** timer_gettime timer_none returned { %ld.%09jd, %ld.%09jd }\n",
Packit Service 82fcde
	      (long) it.it_value.tv_sec, (intmax_t) it.it_value.tv_nsec,
Packit Service 82fcde
	      (long) it.it_interval.tv_sec, (intmax_t) it.it_interval.tv_nsec);
Packit Service 82fcde
      result = 1;
Packit Service 82fcde
    }
Packit Service 82fcde
Packit Service 82fcde
  if (clock_gettime (TEST_CLOCK, &startts) != 0)
Packit Service 82fcde
    {
Packit Service 82fcde
      printf ("*** clock_gettime failed: %m\n");
Packit Service 82fcde
      result = 1;
Packit Service 82fcde
    }
Packit Service 82fcde
Packit Service 82fcde
  it.it_value.tv_sec = 1;
Packit Service 82fcde
  it.it_value.tv_nsec = 0;
Packit Service 82fcde
  it.it_interval.tv_sec = 0;
Packit Service 82fcde
  it.it_interval.tv_nsec = 100000000;
Packit Service 82fcde
  if (timer_settime (timer_none, 0, &it, NULL) != 0)
Packit Service 82fcde
    {
Packit Service 82fcde
      printf ("*** timer_settime timer_none failed: %m\n");
Packit Service 82fcde
      result = 1;
Packit Service 82fcde
    }
Packit Service 82fcde
Packit Service 82fcde
  it.it_value.tv_nsec = 100000000;
Packit Service 82fcde
  it.it_interval.tv_nsec = 200000000;
Packit Service 82fcde
  if (timer_settime (timer_thr1, 0, &it, NULL) != 0)
Packit Service 82fcde
    {
Packit Service 82fcde
      printf ("*** timer_settime timer_thr1 failed: %m\n");
Packit Service 82fcde
      result = 1;
Packit Service 82fcde
    }
Packit Service 82fcde
Packit Service 82fcde
  it.it_value.tv_nsec = 200000000;
Packit Service 82fcde
  it.it_interval.tv_nsec = 300000000;
Packit Service 82fcde
  if (timer_settime (timer_thr2, 0, &it, NULL) != 0)
Packit Service 82fcde
    {
Packit Service 82fcde
      printf ("*** timer_settime timer_thr2 failed: %m\n");
Packit Service 82fcde
      result = 1;
Packit Service 82fcde
    }
Packit Service 82fcde
Packit Service 82fcde
  it.it_value.tv_nsec = 300000000;
Packit Service 82fcde
  it.it_interval.tv_nsec = 400000000;
Packit Service 82fcde
  if (timer_settime (timer_sig1, 0, &it, NULL) != 0)
Packit Service 82fcde
    {
Packit Service 82fcde
      printf ("*** timer_settime timer_sig1 failed: %m\n");
Packit Service 82fcde
      result = 1;
Packit Service 82fcde
    }
Packit Service 82fcde
Packit Service 82fcde
  it.it_value.tv_nsec = 400000000;
Packit Service 82fcde
  it.it_interval.tv_nsec = 500000000;
Packit Service 82fcde
  if (TEMP_FAILURE_RETRY (timer_settime (timer_sig2, 0, &it, NULL)) != 0)
Packit Service 82fcde
    {
Packit Service 82fcde
      printf ("*** timer_settime timer_sig2 failed: %m\n");
Packit Service 82fcde
      result = 1;
Packit Service 82fcde
    }
Packit Service 82fcde
Packit Service 82fcde
  pthread_mutex_lock (&lock);
Packit Service 82fcde
  while (thr1_cnt < 6 || thr2_cnt < 6)
Packit Service 82fcde
    pthread_cond_wait (&cond, &lock);
Packit Service 82fcde
  pthread_mutex_unlock (&lock);
Packit Service 82fcde
Packit Service 82fcde
  while (sig1_cnt < 6 || sig2_cnt < 6)
Packit Service 82fcde
    {
Packit Service 82fcde
      ts.tv_sec = 0;
Packit Service 82fcde
      ts.tv_nsec = 100000000;
Packit Service 82fcde
      nanosleep (&ts, NULL);
Packit Service 82fcde
    }
Packit Service 82fcde
Packit Service 82fcde
  pthread_mutex_lock (&lock);
Packit Service 82fcde
Packit Service 82fcde
  if (thr1_err)
Packit Service 82fcde
    {
Packit Service 82fcde
      puts ("*** an error occurred in thr1");
Packit Service 82fcde
      result = 1;
Packit Service 82fcde
    }
Packit Service 82fcde
  else if (check_ts ("thr1", &startts, &thr1_ts, 1100000 + 4 * 200000))
Packit Service 82fcde
    result = 1;
Packit Service 82fcde
Packit Service 82fcde
  if (thr2_err)
Packit Service 82fcde
    {
Packit Service 82fcde
      puts ("*** an error occurred in thr2");
Packit Service 82fcde
      result = 1;
Packit Service 82fcde
    }
Packit Service 82fcde
  else if (check_ts ("thr2", &startts, &thr2_ts, 1200000 + 4 * 300000))
Packit Service 82fcde
    result = 1;
Packit Service 82fcde
  else if (thr2_guardsize != 0)
Packit Service 82fcde
    {
Packit Service 82fcde
      printf ("*** thr2 guardsize %zd != 0\n", thr2_guardsize);
Packit Service 82fcde
      result = 1;
Packit Service 82fcde
    }
Packit Service 82fcde
Packit Service 82fcde
  pthread_mutex_unlock (&lock);
Packit Service 82fcde
Packit Service 82fcde
  if (sig1_err)
Packit Service 82fcde
    {
Packit Service 82fcde
      printf ("*** errors occurred in sig1 handler %x\n", sig1_err);
Packit Service 82fcde
      result = 1;
Packit Service 82fcde
    }
Packit Service 82fcde
  else if (check_ts ("sig1", &startts, &sig1_ts, 1300000 + 4 * 400000))
Packit Service 82fcde
    result = 1;
Packit Service 82fcde
Packit Service 82fcde
  if (sig2_err)
Packit Service 82fcde
    {
Packit Service 82fcde
      printf ("*** errors occurred in sig2 handler %x\n", sig2_err);
Packit Service 82fcde
      result = 1;
Packit Service 82fcde
    }
Packit Service 82fcde
  else if (check_ts ("sig2", &startts, &sig2_ts, 1400000 + 4 * 500000))
Packit Service 82fcde
    result = 1;
Packit Service 82fcde
Packit Service 82fcde
  if (timer_gettime (timer_none, &it) != 0)
Packit Service 82fcde
    {
Packit Service 82fcde
      printf ("*** timer_gettime timer_none failed: %m\n");
Packit Service 82fcde
      result = 1;
Packit Service 82fcde
    }
Packit Service 82fcde
  else if (it.it_interval.tv_sec || it.it_interval.tv_nsec != 100000000)
Packit Service 82fcde
    {
Packit Service 82fcde
      printf ("\
Packit Service 82fcde
!!! second timer_gettime timer_none returned it_interval %ld.%09jd\n",
Packit Service 82fcde
	      (long) it.it_interval.tv_sec, (intmax_t) it.it_interval.tv_nsec);
Packit Service 82fcde
      /* FIXME: For now disabled.
Packit Service 82fcde
      result = 1; */
Packit Service 82fcde
    }
Packit Service 82fcde
Packit Service 82fcde
  if (timer_delete (timer_none) != 0)
Packit Service 82fcde
    {
Packit Service 82fcde
      printf ("*** timer_delete for timer_none failed: %m\n");
Packit Service 82fcde
      result = 1;
Packit Service 82fcde
    }
Packit Service 82fcde
Packit Service 82fcde
  if (timer_delete (timer_sig1) != 0)
Packit Service 82fcde
    {
Packit Service 82fcde
      printf ("*** timer_delete for timer_sig1 failed: %m\n");
Packit Service 82fcde
      result = 1;
Packit Service 82fcde
    }
Packit Service 82fcde
Packit Service 82fcde
  if (timer_delete (timer_sig2) != 0)
Packit Service 82fcde
    {
Packit Service 82fcde
      printf ("*** timer_delete for timer_sig2 failed: %m\n");
Packit Service 82fcde
      result = 1;
Packit Service 82fcde
    }
Packit Service 82fcde
Packit Service 82fcde
  if (timer_delete (timer_thr1) != 0)
Packit Service 82fcde
    {
Packit Service 82fcde
      printf ("*** timer_delete for timer_thr1 failed: %m\n");
Packit Service 82fcde
      result = 1;
Packit Service 82fcde
    }
Packit Service 82fcde
Packit Service 82fcde
  if (timer_delete (timer_thr2) != 0)
Packit Service 82fcde
    {
Packit Service 82fcde
      printf ("*** timer_delete for timer_thr2 failed: %m\n");
Packit Service 82fcde
      result = 1;
Packit Service 82fcde
    }
Packit Service 82fcde
  return result;
Packit Service 82fcde
}
Packit Service 82fcde
Packit Service 82fcde
#elif defined TEST_CLOCK_MISSING
Packit Service 82fcde
/* This just ensures that any functions called in TEST_CLOCK_MISSING
Packit Service 82fcde
   are not diagnosed as unused.  */
Packit Service 82fcde
# define TEST_FUNCTION (TEST_CLOCK_MISSING (TEST_CLOCK), 0)
Packit Service 82fcde
#else
Packit Service 82fcde
# define TEST_FUNCTION 0
Packit Service 82fcde
#endif
Packit Service 82fcde
Packit Service 82fcde
#include "../test-skeleton.c"