All pastes #479239 Raw Edit

Unnamed

public text v1 · immutable
·published 2007-05-09 17:01 UTC
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;
}