home *** CD-ROM | disk | FTP | other *** search
/ Aminet 18 / aminetcdnumber181997.iso / Aminet / misc / emu / AROSdev.lha / AROS / config / i386 / initcore.c < prev    next >
Encoding:
C/C++ Source or Header  |  1997-01-28  |  1.2 KB  |  57 lines

  1. #include <hardware/intbits.h>
  2. #include <exec/interrupts.h>
  3. #include <exec/execbase.h>
  4. #include <proto/exec.h>
  5. #include <aros/asmcall.h>
  6. #include <signal.h>
  7. #define timeval     sys_timeval
  8. #include <sys/time.h>
  9. #undef timeval
  10.  
  11. void disable(void);
  12. static int sig2inttabl[NSIG];
  13. char supervisor;
  14.  
  15. static void signals(int sig)
  16. {
  17.     struct IntVector *iv;
  18.     supervisor++;
  19.     iv=&SysBase->IntVects[sig2inttabl[sig]];
  20.     if (iv->iv_Code)
  21.     {
  22.     AROS_UFC2(void,iv->iv_Code,
  23.         AROS_UFCA(APTR,iv->iv_Data,A1),
  24.         AROS_UFCA(struct ExecBase *,SysBase,A6)
  25.     );
  26.     }
  27.     AROS_ASMSYMNAME(disable)();
  28.     supervisor--;
  29.     if(SysBase->AttnResched&0x8000)
  30.     {
  31.     SysBase->AttnResched&=~0x8000;
  32.     Dispatch();
  33.     }
  34. }
  35.  
  36. void InitCore(void)
  37. {
  38.     static const int sig2int[][2]=
  39.     {
  40.     {   SIGALRM, INTB_VERTB   },
  41.     };
  42.     struct itimerval interval;
  43.     int i;
  44.     struct sigaction sa={ signals, ~0ul, 0, NULL };
  45.  
  46.     for(i=0;i<sizeof(sig2int)/sizeof(sig2int[0]);i++)
  47.     {
  48.     sig2inttabl[sig2int[i][0]]=sig2int[i][1];
  49.     sigaction(sig2int[i][0],&sa,NULL);
  50.     }
  51.  
  52.     interval.it_interval.tv_sec = interval.it_value.tv_sec = 0;
  53.     interval.it_interval.tv_usec = interval.it_value.tv_usec = 1000000/50;
  54.  
  55.     setitimer (ITIMER_REAL, &interval, NULL);
  56. }
  57.