| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283 | /* Tests for POSIX timer implementation using thread CPU clock.  */#include <unistd.h>#if _POSIX_THREADS && defined _POSIX_CPUTIME#include <errno.h>#include <stdio.h>#include <stdlib.h>#include <string.h>#include <fcntl.h>#include <time.h>#include <pthread.h>static clockid_t worker_thread_clock;#define TEST_CLOCK worker_thread_clock#define TEST_CLOCK_MISSING(clock) \  (setup_test () ? "thread CPU clock timer support" : NULL)/* This function is intended to rack up both user and system time.  */static void *chew_cpu (void *arg){  while (1)    {      static volatile char buf[4096];      for (int i = 0; i < 100; ++i)	for (size_t j = 0; j < sizeof buf; ++j)	  buf[j] = 0xaa;      int nullfd = open ("/dev/null", O_WRONLY);      for (int i = 0; i < 100; ++i)	for (size_t j = 0; j < sizeof buf; ++j)	  buf[j] = 0xbb;      write (nullfd, (char *) buf, sizeof buf);      close (nullfd);    }  return NULL;}static intsetup_test (void){  /* Test timers on a thread CPU clock by having a worker thread eating     CPU.  First make sure we can make such timers at all.  */  pthread_t th;  int e = pthread_create (&th, NULL, chew_cpu, NULL);  if (e != 0)    {      printf ("pthread_create: %s\n", strerror (e));      exit (1);    }  e = pthread_getcpuclockid (th, &worker_thread_clock);  if (e == EPERM || e == ENOENT || e == ENOTSUP)    {      puts ("pthread_getcpuclockid does not support other threads");      return 1;    }  if (e != 0)    {      printf ("pthread_getcpuclockid: %s\n", strerror (e));      exit (1);    }  timer_t t;  if (timer_create (TEST_CLOCK, NULL, &t) != 0)    {      printf ("timer_create: %m\n");      return 1;    }  timer_delete (t);  return 0;}#else# define TEST_CLOCK_MISSING(clock) "process clocks"#endif#include "tst-timer4.c"
 |