#define TIMER

#include "main.h"
#include "timer.h"
#include <sys/wait.h>

static int usec;

/* ひたすら回り続けるタイマ */
static void napx(int sig)
{
  signal(SIGALRM,SIG_IGN);
  itp.it_value.tv_usec=usec;
  setitimer(ITIMER_REAL,&itp,(struct itimerval *)0);
  signal(SIGALRM,napx);
}

/* n clock 待つ */
void nap(int n)
{
  for(;n>0;n--) sigpause(SIGALRM);
}

/* 一秒間に何回位割り込みが入るか計測 */
static int count=0;
static void napxc(int sig)
{
  signal(SIGALRM,SIG_IGN);
  itp.it_value.tv_usec=usec;
  setitimer(ITIMER_REAL,&itp,(struct itimerval *)0);
  count++;
  signal(SIGALRM,napxc);
}

/* タイマを初期化 */
void init_timer()
{
  int child;

  usec=1000000/ALRM_PAR_SEC;

  itp.it_interval.tv_sec=0;
  itp.it_interval.tv_usec=0;
  itp.it_value.tv_sec=0;
  itp.it_value.tv_usec=usec;

#ifdef REG_TIMER
  /* 割り込み間隔を補正します */

  if( !(child=fork()) )
  {
    /* child process */
    sleep(3);
    exit(0);
  }

  setitimer(ITIMER_REAL,&itp,(struct itimerval *)0);
  signal(SIGALRM,napxc);
  while(wait3((int *)0,WNOHANG,NULL)!=child) sigpause(SIGALRM);
  signal(SIGALRM,SIG_IGN);
  count/=3;
  usec=(1000000*count)/(ALRM_PAR_SEC*ALRM_PAR_SEC);
#endif

  itp.it_interval.tv_sec=0;
  itp.it_interval.tv_usec=0;
  itp.it_value.tv_sec=0;
  itp.it_value.tv_usec=usec;

  setitimer(ITIMER_REAL,&itp,(struct itimerval *)0);
  signal(SIGALRM,napx);
}
