123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107 |
- { %norun }
- { %target=darwin,linux,freebsd,solaris,beos,haiku }
- {$mode delphi}
- {$ifdef darwin}
- {$PIC+}
- {$endif darwin}
- {$ifdef CPUX86_64}
- {$ifndef WINDOWS}
- {$PIC+}
- {$endif WINDOWS}
- {$endif CPUX86_64}
- library tw12704a;
- uses
- SysUtils;
- procedure initsignals;
- var
- p: pointer;
- i: longint;
- begin
- // check that none of the handlers have been yet by the library's init code
- for i:=RTL_SIGINT to RTL_SIGLAST do
- if (InquireSignal(i) <> ssNotHooked) then
- halt(1);
- // hook standard signals
- HookSignal(RTL_SIGDEFAULT);
- for i:=RTL_SIGINT to RTL_SIGLAST do
- case i of
- RTL_SIGINT,
- RTL_SIGQUIT:
- if (InquireSignal(i) <> ssNotHooked) then
- halt(2);
- RTL_SIGFPE,
- RTL_SIGSEGV,
- RTL_SIGILL,
- RTL_SIGBUS:
- if (InquireSignal(i) <> ssHooked) then
- halt(3);
- else
- halt(4);
- end;
- // unhook sigill
- UnHookSignal(RTL_SIGILL);
- for i:=RTL_SIGINT to RTL_SIGLAST do
- case i of
- RTL_SIGINT,
- RTL_SIGILL,
- RTL_SIGQUIT:
- if (InquireSignal(i) <> ssNotHooked) then
- halt(5);
- RTL_SIGFPE,
- RTL_SIGSEGV,
- RTL_SIGBUS:
- if (InquireSignal(i) <> ssHooked) then
- halt(6);
- end;
- // check whether installed signal handler actually works
- (*
- try
- p:=nil;
- longint(p^):=1;
- except
- end;
- *)
- end;
- procedure testsignals; cdecl;
- var
- i: longint;
- begin
- // called from program -> it has overridden our signal handlers
- // when this routine is called, it will have unhooked sigbus, so
- // that one should still belong to us
- // we previously unhooked sigill, so that one should still be
- // unhooked as far as we are concerned
- for i:=RTL_SIGINT to RTL_SIGLAST do
- case i of
- RTL_SIGINT,
- RTL_SIGILL,
- RTL_SIGQUIT:
- if (InquireSignal(i) <> ssNothooked) then
- halt(7);
- RTL_SIGFPE,
- RTL_SIGSEGV:
- if (InquireSignal(i) <> ssOverridden) then
- halt(8);
- RTL_SIGBUS:
- if (InquireSignal(i) <> ssHooked) then
- halt(9);
- end;
- end;
- exports
- testsignals;
- begin
- initsignals;
- end.
|