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

  1. /*
  2.      (C) 1995-96 AROS - The Amiga Replacement OS
  3.      $Id: initcore.c,v 1.2 1997/01/01 03:32:55 ldp Exp $
  4.  
  5.      Desc:
  6.      Lang:
  7. */
  8.  
  9. #include <hardware/intbits.h>
  10. #include <exec/interrupts.h>
  11. #include <exec/execbase.h>
  12. #include <proto/exec.h>
  13. #include <aros/asmcall.h>
  14. #include <signal.h>
  15. #include <sys/time.h>
  16.  
  17. static int sig2inttabl[NSIG];
  18. char supervisor;
  19.  
  20. void disable(void)
  21. {
  22.     sigset_t x = -1;
  23.  
  24.     sigprocmask(0, &x, 0);
  25. }
  26.  
  27. static void signals(int sig)
  28. {
  29.     struct IntVector *iv;
  30.     supervisor++;
  31.     iv=&SysBase->IntVects[sig2inttabl[sig]];
  32.     AROS_UFC2(void,iv->iv_Code,
  33.         AROS_UFCA(APTR,iv->iv_Data,A1),
  34.         AROS_UFCA(struct ExecBase *,SysBase,A6));
  35.     disable();
  36.     supervisor--;
  37.     if(SysBase->AttnResched&0x8000)
  38.     {
  39.         SysBase->AttnResched&=~0x8000;
  40.         Dispatch();
  41.     }
  42. }
  43.  
  44. void InitCore(void)
  45. {
  46.     static const int sig2int[][2]=
  47.     {
  48.         {   SIGALRM, INTB_VERTB   },
  49.     };
  50.     struct itimerval interval;
  51.     int i;
  52.     struct sigaction sa={ signals, ~0ul, 0 };
  53.  
  54.     for(i=0;i<sizeof(sig2int)/sizeof(sig2int[0]);i++)
  55.     {
  56.         sig2inttabl[sig2int[i][0]]=sig2int[i][1];
  57.         sigaction(sig2int[i][0],&sa,NULL);
  58.     }
  59.  
  60.     interval.it_interval.tv_sec = interval.it_value.tv_sec = 0;
  61.     interval.it_interval.tv_usec = interval.it_value.tv_usec = 1000000/50;
  62.  
  63.     setitimer (ITIMER_REAL, &interval, NULL);
  64. }
  65.