147beabb1386be44e3f90dbc30a0b22c23b93a4dcJim Ingham#include <stdio.h>
247beabb1386be44e3f90dbc30a0b22c23b93a4dcJim Ingham#include <unistd.h>
347beabb1386be44e3f90dbc30a0b22c23b93a4dcJim Ingham#include <sys/time.h>
447beabb1386be44e3f90dbc30a0b22c23b93a4dcJim Ingham#include <stdint.h>
547beabb1386be44e3f90dbc30a0b22c23b93a4dcJim Ingham
647beabb1386be44e3f90dbc30a0b22c23b93a4dcJim Inghamint
747beabb1386be44e3f90dbc30a0b22c23b93a4dcJim Inghamwait_a_while (useconds_t interval)
847beabb1386be44e3f90dbc30a0b22c23b93a4dcJim Ingham{
947beabb1386be44e3f90dbc30a0b22c23b93a4dcJim Ingham  int num_times = 0;
1047beabb1386be44e3f90dbc30a0b22c23b93a4dcJim Ingham  int return_value = 1;
1147beabb1386be44e3f90dbc30a0b22c23b93a4dcJim Ingham
1247beabb1386be44e3f90dbc30a0b22c23b93a4dcJim Ingham  struct timeval start_time;
1347beabb1386be44e3f90dbc30a0b22c23b93a4dcJim Ingham  gettimeofday(&start_time, NULL);
1447beabb1386be44e3f90dbc30a0b22c23b93a4dcJim Ingham  uint64_t target = start_time.tv_sec * 1000000 + start_time.tv_usec + interval;
1547beabb1386be44e3f90dbc30a0b22c23b93a4dcJim Ingham
1647beabb1386be44e3f90dbc30a0b22c23b93a4dcJim Ingham  while (1)
1747beabb1386be44e3f90dbc30a0b22c23b93a4dcJim Ingham    {
1847beabb1386be44e3f90dbc30a0b22c23b93a4dcJim Ingham      num_times++;
1947beabb1386be44e3f90dbc30a0b22c23b93a4dcJim Ingham      return_value = usleep (interval);
2047beabb1386be44e3f90dbc30a0b22c23b93a4dcJim Ingham      if (return_value != 0)
2147beabb1386be44e3f90dbc30a0b22c23b93a4dcJim Ingham        {
2247beabb1386be44e3f90dbc30a0b22c23b93a4dcJim Ingham          struct timeval now;
2347beabb1386be44e3f90dbc30a0b22c23b93a4dcJim Ingham          gettimeofday(&now, NULL);
2447beabb1386be44e3f90dbc30a0b22c23b93a4dcJim Ingham          interval = target - now.tv_sec * 1000000 + now.tv_usec;
2547beabb1386be44e3f90dbc30a0b22c23b93a4dcJim Ingham        }
2647beabb1386be44e3f90dbc30a0b22c23b93a4dcJim Ingham      else
2747beabb1386be44e3f90dbc30a0b22c23b93a4dcJim Ingham        break;
2847beabb1386be44e3f90dbc30a0b22c23b93a4dcJim Ingham    }
2947beabb1386be44e3f90dbc30a0b22c23b93a4dcJim Ingham  return num_times;
3047beabb1386be44e3f90dbc30a0b22c23b93a4dcJim Ingham}
3147beabb1386be44e3f90dbc30a0b22c23b93a4dcJim Ingham
3247beabb1386be44e3f90dbc30a0b22c23b93a4dcJim Inghamint
3347beabb1386be44e3f90dbc30a0b22c23b93a4dcJim Inghammain (int argc, char **argv)
3447beabb1386be44e3f90dbc30a0b22c23b93a4dcJim Ingham{
3547beabb1386be44e3f90dbc30a0b22c23b93a4dcJim Ingham  printf ("stop here in main.\n");
3647beabb1386be44e3f90dbc30a0b22c23b93a4dcJim Ingham  int num_times = wait_a_while (argc * 1000);
3747beabb1386be44e3f90dbc30a0b22c23b93a4dcJim Ingham  printf ("Done, took %d times.\n", num_times);
3847beabb1386be44e3f90dbc30a0b22c23b93a4dcJim Ingham
3947beabb1386be44e3f90dbc30a0b22c23b93a4dcJim Ingham  return 0;
4047beabb1386be44e3f90dbc30a0b22c23b93a4dcJim Ingham
4147beabb1386be44e3f90dbc30a0b22c23b93a4dcJim Ingham}
42