v0.97c
[apc.git] / hog.c
blob4544fdd33938d92ff266a13c4580aa638601f9d2
1 /* gcc -o hog hog.c */
2 #define _GNU_SOURCE
3 #include <err.h>
4 #include <time.h>
5 #include <stdio.h>
6 #include <sched.h>
7 #include <limits.h>
8 #include <stdlib.h>
9 #include <signal.h>
10 #include <sys/time.h>
12 #define HIST 10
14 static sig_atomic_t stop;
16 static void sighandler (int signr)
18 (void) signr;
19 stop = 1;
22 static unsigned long hog (unsigned long niters)
24 stop = 0;
25 while (!stop && --niters)
27 return niters;
30 int main (void)
32 unsigned int i;
33 struct itimerval it;
34 sigset_t set;
35 unsigned long v[HIST];
36 double tmp = 0.0;
37 unsigned long n;
39 it.it_interval.tv_sec = 0;
40 it.it_interval.tv_usec = 1;
41 it.it_value.tv_sec = 0;
42 it.it_value.tv_usec = 1;
44 if (signal (SIGALRM, &sighandler)) {
45 err (EXIT_FAILURE, "failed to set signal handler");
48 if (setitimer (ITIMER_REAL, &it, NULL)) {
49 err (EXIT_FAILURE, "failed to set interval timer");
52 for (i = 0; i < HIST; ++i) {
53 v[i] = ULONG_MAX - hog (ULONG_MAX);
56 for (i = 0; i < HIST; ++i) {
57 printf ("%d = %ld\n", i, v[i]);
58 tmp += v[i];
60 tmp /= HIST;
61 n = tmp - (tmp / 3);
63 if (sigemptyset (&set)) {
64 err (EXIT_FAILURE, "failed to empty sigset");
67 if (sigaddset (&set, SIGALRM)) {
68 err (EXIT_FAILURE, "failed to add to sigset");
71 for (;;) {
72 int signr;
74 hog (n);
75 if (sigwait (&set, &signr)) {
76 err (EXIT_FAILURE, "failed to wait for a signal");
80 return 0;