rendered paste body/* gcc -o hog hog.c */
#define _GNU_SOURCE
#ifdef __sun__
#include <errno.h>
#else
#include <err.h>
#endif
#include <time.h>
#include <stdio.h>
#include <sched.h>
#include <limits.h>
#include <stdlib.h>
#ifdef __sun__
#define _POSIX_PTHREAD_SEMANTICS 1
#endif
#include <signal.h>
#include <sys/time.h>
#define HIST 10
static sig_atomic_t stop;
static void sighandler (int signr)
{
(void) signr;
stop = 1;
}
static unsigned long hog (unsigned long niters)
{
stop = 0;
while (!stop && --niters)
;
return niters;
}
int main (void)
{
unsigned int i;
struct itimerval it;
sigset_t set;
unsigned long v[HIST];
double tmp = 0.0;
unsigned long n;
it.it_interval.tv_sec = 0;
it.it_interval.tv_usec = 1;
it.it_value.tv_sec = 0;
it.it_value.tv_usec = 1;
if (signal (SIGALRM, &sighandler)) {
#ifdef __sun__
fprintf(stderr, "failed to set signal handler");
exit(1);
#else
err (EXIT_FAILURE, "failed to set signal handler");
#endif
}
if (setitimer (ITIMER_REAL, &it, NULL)) {
#ifdef __sun__
fprintf(stderr,"failed to set interval timer");
exit(1);
#else
err (EXIT_FAILURE, "failed to set interval timer");
#endif
}
for (i = 0; i < HIST; ++i) {
v[i] = ULONG_MAX - hog (ULONG_MAX);
}
for (i = 0; i < HIST; ++i) {
printf ("%d = %ld\n", i, v[i]);
tmp += v[i];
}
tmp /= HIST;
n = tmp - (tmp / 3);
if (sigemptyset (&set)) {
#ifdef __sun__
fprintf( stderr, "failed to empty sigset");
exit(1);
#else
err (EXIT_FAILURE, "failed to empty sigset");
#endif
}
if (sigaddset (&set, SIGALRM)) {
#ifdef __sun__
fprintf(stderr, "failed to add to sigset");
exit(1);
#else
err (EXIT_FAILURE, "failed to add to sigset");
#endif
}
for (;;) {
int signr;
hog (n);
if (sigwait (&set, &signr)) {
#ifdef __sun__
fprintf(stderr, "failed to wait for a signal");
exit(1);
#else
err (EXIT_FAILURE, "failed to wait for a signal");
#endif
}
}
return 0;
}