v0.98
[apc.git] / hog.c
blobde2db1a640e1b8d6750d431edc4acb58a752a8f9
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 volatile 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 hog (ULONG_MAX);
53 for (i = 0; i < HIST; ++i) {
54 v[i] = ULONG_MAX - hog (ULONG_MAX);
57 for (i = 0; i < HIST; ++i) {
58 printf ("%d = %ld\n", i, v[i]);
59 tmp += v[i];
61 tmp /= HIST;
62 n = tmp - (tmp / 3);
64 if (sigemptyset (&set)) {
65 err (EXIT_FAILURE, "failed to empty sigset");
68 if (sigaddset (&set, SIGALRM)) {
69 err (EXIT_FAILURE, "failed to add to sigset");
72 for (;;) {
73 int signr;
75 hog (n);
76 if (sigwait (&set, &signr)) {
77 err (EXIT_FAILURE, "failed to wait for a signal");
81 return 0;