#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <time.h>
#include <errno.h>
#include <assert.h>
#include <unistd.h>
#include <sys/time.h>
static int alarm_pipe[2];
extern "C" {
static int xsignal (int sig, void (*handler)(int))
{
struct sigaction sa;
sa.sa_handler = handler;
sigemptyset(&sa.sa_mask);
sa.sa_flags = 0;
return sigaction(sig, &sa, NULL);
}
void sigalarm_handler (int)
{
if (write(alarm_pipe[1], "", 1) != 1) {
char msg[] = "write: failed from sigalarm_handler\n";
write(2, msg, sizeof(msg)-1);
abort();
}
}
}
int main ()
{
if (pipe(alarm_pipe) != 0) {
perror("pipe");
exit(EXIT_FAILURE);
}
if (xsignal(SIGALRM, sigalarm_handler) != 0) {
perror("sigaction");
exit(EXIT_FAILURE);
}
struct itimerval it = { { 0, 200000 }, { 0, 200000 } };
if (setitimer(ITIMER_REAL, &it, 0) != 0) {
perror("setitimer");
exit(EXIT_FAILURE);
}
char c;
struct timeval tv;
for (int i = 0; i < 10; ++i) {
for (;;) {
ssize_t alarm_pipe_read_result = read(alarm_pipe[0], &c, 1);
if ((alarm_pipe_read_result < 0) && (errno == EINTR)) continue;
assert(alarm_pipe_read_result == 1);
break;
}
//... do sampling ...
gettimeofday(&tv, 0);
std::cerr << tv.tv_usec/1000 << std::endl;
}
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHNpZ25hbC5oPgojaW5jbHVkZSA8dGltZS5oPgojaW5jbHVkZSA8ZXJybm8uaD4KI2luY2x1ZGUgPGFzc2VydC5oPgoKI2luY2x1ZGUgPHVuaXN0ZC5oPgojaW5jbHVkZSA8c3lzL3RpbWUuaD4KCnN0YXRpYyBpbnQgYWxhcm1fcGlwZVsyXTsKCmV4dGVybiAiQyIgewogICAgc3RhdGljIGludCB4c2lnbmFsIChpbnQgc2lnLCB2b2lkICgqaGFuZGxlcikoaW50KSkKICAgIHsKICAgICAgICBzdHJ1Y3Qgc2lnYWN0aW9uIHNhOwogICAgICAgIHNhLnNhX2hhbmRsZXIgPSBoYW5kbGVyOwogICAgICAgIHNpZ2VtcHR5c2V0KCZzYS5zYV9tYXNrKTsKICAgICAgICBzYS5zYV9mbGFncyA9IDA7CiAgICAgICAgcmV0dXJuIHNpZ2FjdGlvbihzaWcsICZzYSwgTlVMTCk7CiAgICB9CgogICAgdm9pZCBzaWdhbGFybV9oYW5kbGVyIChpbnQpCiAgICB7CiAgICAgICAgaWYgKHdyaXRlKGFsYXJtX3BpcGVbMV0sICIiLCAxKSAhPSAxKSB7CiAgICAgICAgICAgIGNoYXIgbXNnW10gPSAid3JpdGU6IGZhaWxlZCBmcm9tIHNpZ2FsYXJtX2hhbmRsZXJcbiI7CiAgICAgICAgICAgIHdyaXRlKDIsIG1zZywgc2l6ZW9mKG1zZyktMSk7CiAgICAgICAgICAgIGFib3J0KCk7CiAgICAgICAgfQogICAgfQp9CgppbnQgbWFpbiAoKQp7CiAgICBpZiAocGlwZShhbGFybV9waXBlKSAhPSAwKSB7CiAgICAgICAgcGVycm9yKCJwaXBlIik7CiAgICAgICAgZXhpdChFWElUX0ZBSUxVUkUpOwogICAgfQoKICAgIGlmICh4c2lnbmFsKFNJR0FMUk0sIHNpZ2FsYXJtX2hhbmRsZXIpICE9IDApIHsKICAgICAgICBwZXJyb3IoInNpZ2FjdGlvbiIpOwogICAgICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKICAgIH0KCiAgICBzdHJ1Y3QgaXRpbWVydmFsIGl0ID0geyB7IDAsIDIwMDAwMCB9LCB7IDAsIDIwMDAwMCB9IH07CiAgICBpZiAoc2V0aXRpbWVyKElUSU1FUl9SRUFMLCAmaXQsIDApICE9IDApIHsKICAgICAgICBwZXJyb3IoInNldGl0aW1lciIpOwogICAgICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKICAgIH0KCiAgICBjaGFyIGM7CiAgICBzdHJ1Y3QgdGltZXZhbCB0djsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTA7ICsraSkgewogICAgICAgIGZvciAoOzspIHsKICAgICAgICAgICAgc3NpemVfdCBhbGFybV9waXBlX3JlYWRfcmVzdWx0ID0gcmVhZChhbGFybV9waXBlWzBdLCAmYywgMSk7CiAgICAgICAgICAgIGlmICgoYWxhcm1fcGlwZV9yZWFkX3Jlc3VsdCA8IDApICYmIChlcnJubyA9PSBFSU5UUikpIGNvbnRpbnVlOwogICAgICAgICAgICBhc3NlcnQoYWxhcm1fcGlwZV9yZWFkX3Jlc3VsdCA9PSAxKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIC8vLi4uIGRvIHNhbXBsaW5nIC4uLgogICAgICAgIGdldHRpbWVvZmRheSgmdHYsIDApOwogICAgICAgIHN0ZDo6Y2VyciA8PCB0di50dl91c2VjLzEwMDAgPDwgc3RkOjplbmRsOwogICAgfQp9Cg==