/** Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 2 1 Ġby ĠK rist offer ĠPaul sson Ġ< k rist offer . paul sson @ t alent en . se >. Ċ Ġ* Ċ Ġ* ĠThis Ġsoftware Ġis Ġavailable Ġunder Ġthe Ġterms Ġof Ġthe ĠMIT Ġlicense . ĠPart s Ġare Ġlicensed Ċ Ġ* Ġunder Ġdifferent Ġterms Ġif Ġstated . ĠThe Ġlegal Ġterms Ġare Ġattached Ġto Ġthe ĠLICENSE Ġfile Ċ Ġ* Ġand Ġare Ġmade Ġavailable Ġon : Ċ Ġ* Ċ Ġ* ĠĠĠĠĠ Ġhttps :// opensource . org / licenses / MIT Ċ Ġ* Ċ Ġ* ĠSPDX - License - Identifier : ĠMIT Ċ Ġ* Ċ Ġ* ĠContributors : Ċ Ġ* ĠĠĠĠĠ ĠK rist offer ĠPaul sson Ġ- Ġinitial Ġimplementation Ċ Ġ*/ Ċ package Ġange los . io . signal Ċ Ċ import Ġange los . interop . Abstract Proc Ċ import Ġange los . interop . Proc Ċ Ċ class ĠSignal Ġinternal Ġconstructor ( ĊĠĠĠ Ġprivate Ġval Ġhandlers : ĠMutable List < Signal Handler > Ġ= Ġmutable ListOf (), ĊĠĠĠ Ġprivate Ġval Ġsignals : ĠMutable List < Int > Ġ= Ġmutable ListOf (), ĊĠĠĠ Ġprivate Ġval Ġmap : ĠHashMap < Int , ĠSignal Handler > Ġ= ĠHashMap () Ċ ){ ĊĠĠĠ Ġenum Ġclass ĠNum ( val Ġsign um : ĠInt ){ ĊĠĠĠĠĠĠĠ ĠSIG AB RT ( 8 ), Ġ// ĠP 1 9 9 0 , ĠCore , ĠAbort Ġsignal Ġfrom Ġabort ( 3 ) ĊĠĠĠĠĠĠĠ ĠSIG AL RM ( 1 4 ), Ġ// ĠP 1 9 9 0 , ĠTerm , ĠTimer Ġsignal Ġfrom Ġalarm ( 2 ) ĊĠĠĠĠĠĠĠ ĠSIG BUS ( 7 ), Ġ// ĠP 2 0 0 1 , ĠCore , ĠBus Ġerror Ġ( bad Ġmemory Ġaccess ) ĊĠĠĠĠĠĠĠ ĠSIG CH LD ( 1 7 ), Ġ// ĠP 1 9 9 0 , ĠIgn , ĠChild Ġstopped Ġor Ġterminated ĊĠĠĠĠĠĠĠ ĠSIG CONT ( 1 8 ), Ġ// ĠP 1 9 9 0 , ĠCont , ĠContinue Ġif Ġstopped ĊĠĠĠĠĠĠĠ ĠSIG F PE ( 8 ), Ġ// ĠP 1 9 9 0 , ĠCore , ĠFloating - point Ġexception ĊĠĠĠĠĠĠĠ ĠS IGH UP ( 1 ), Ġ// ĠP 1 9 9 0 , ĠTerm , ĠH ang up Ġdetected Ġon Ġcontrolling Ġterminal Ġor Ġdeath Ġof Ġcontrolling Ġprocess ĊĠĠĠĠĠĠĠ ĠSIG ILL ( 4 ), Ġ// ĠP 1 9 9 0 , ĠCore , ĠIllegal ĠInstruction ĊĠĠĠĠĠĠĠ ĠSIG INT ( 2 ), Ġ// ĠP 1 9 9 0 , ĠTerm , ĠInterrupt Ġfrom Ġkeyboard ĊĠĠĠĠĠĠĠ ĠSIG IO ( 2 9 ), Ġ// Ġ- , ĠTerm , ĠI / O Ġnow Ġpossible Ġ( 4 . 2 BSD ) ĊĠĠĠĠĠĠĠ ĠSIG KILL ( 9 ), Ġ// ĠP 1 9 9 0 , ĠTerm , ĠKill Ġsignal ĊĠĠĠĠĠĠĠ Ġ// SIG LO ST Ġ// Ġ- , ĠTerm , ĠFile Ġlock Ġlost Ġ( unused ) ĊĠĠĠĠĠĠĠ ĠSIG PIPE ( 1 3 ), Ġ// ĠP 1 9 9 0 , ĠTerm , ĠBroken Ġpipe : Ġwrite Ġto Ġpipe Ġwith Ġno Ġreaders ; Ġsee Ġpipe ( 7 ) ĊĠĠĠĠĠĠĠ ĠSIG PRO F ( 2 7 ), Ġ// ĠP 2 0 0 1 , ĠTerm , ĠPro filing Ġtimer Ġexpired ĊĠĠĠĠĠĠĠ ĠSIG PWR ( 3 0 ), Ġ// Ġ- , ĠTerm , ĠPower Ġfailure Ġ( System ĠV ) ĊĠĠĠĠĠĠĠ ĠSIG QU IT ( 3 ), Ġ// ĠP 1 9 9 0 , ĠCore , ĠQu it Ġfrom Ġkeyboard ĊĠĠĠĠĠĠĠ ĠSIG SE GV ( 1 1 ), Ġ// ĠP 1 9 9 0 , ĠCore , ĠInvalid Ġmemory Ġreference ĊĠĠĠĠĠĠĠ ĠSIG ST K FLT ( 6 ), Ġ// Ġ- , ĠTerm , ĠStack Ġfault Ġon Ġco processor Ġ( unused ) ĊĠĠĠĠĠĠĠ ĠSIG STOP ( 1 9 ), Ġ// ĠP 1 9 9 0 , ĠStop , ĠStop Ġprocess ĊĠĠĠĠĠĠĠ ĠSIG T ST P ( 2 0 ), Ġ// ĠP 1 9 9 0 , ĠStop , ĠStop Ġtyped Ġat Ġterminal ĊĠĠĠĠĠĠĠ ĠSIG SYS ( 3 1 ), Ġ// ĠP 2 0 0 1 , ĠCore , ĠBad Ġsystem Ġcall Ġ( SV r 4 ); Ġsee Ġalso Ġsec comp ( 2 ) ĊĠĠĠĠĠĠĠ ĠSIG TERM ( 1 5 ), Ġ// ĠP 1 9 9 0 , ĠTerm , ĠTermin ation Ġsignal ĊĠĠĠĠĠĠĠ ĠSIG TRAP ( 5 ), Ġ// ĠP 2 0 0 1 , Ġ ĠCore , ĠTrace / breakpoint Ġtrap ĊĠĠĠĠĠĠĠ ĠSIG TT IN ( 2 1 ), Ġ// ĠP 1 9 9 0 , ĠStop , ĠTerminal Ġinput Ġfor Ġbackground Ġprocess ĊĠĠĠĠĠĠĠ ĠSIG T TO U ( 2 2 ), Ġ// ĠP 1 9 9 0 , ĠStop , ĠTerminal Ġoutput Ġfor Ġbackground Ġprocess ĊĠĠĠĠĠĠĠ ĠSIG UR G ( 2 3 ), Ġ// ĠP 2 0 0 1 , ĠIgn , ĠU rg ent Ġcondition Ġon Ġsocket Ġ( 4 . 2 BSD ) ĊĠĠĠĠĠĠĠ ĠSIG USR 1 ( 1 0 ), Ġ// ĠP 1 9 9 0 , ĠTerm , ĠUser - defined Ġsignal Ġ 1 ĊĠĠĠĠĠĠĠ ĠSIG USR 2 ( 1 2 ), Ġ// ĠP 1 9 9 0 , ĠTerm , ĠUser - defined Ġsignal Ġ 2 ĊĠĠĠĠĠĠĠ ĠSIG VT AL RM ( 2 6 ), Ġ// ĠP 2 0 0 1 , ĠTerm , ĠVirtual Ġalarm Ġclock Ġ( 4 . 2 BSD ) ĊĠĠĠĠĠĠĠ ĠSIG X CPU ( 2 4 ), Ġ// ĠP 2 0 0 1 , ĠCore , ĠCPU Ġtime Ġlimit Ġexceeded Ġ( 4 . 2 BSD ); Ġsee Ġse tr limit ( 2 ) ĊĠĠĠĠĠĠĠ ĠSIG X FS Z ( 2 5 ), Ġ// ĠP 2 0 0 1 , ĠCore , ĠFile Ġsize Ġlimit Ġexceeded Ġ( 4 . 2 BSD ); Ġsee Ġse tr limit ( 2 ) ĊĠĠĠĠĠĠĠ ĠSIG WIN CH ( 2 8 ) Ġ// Ġ- , ĠIgn , ĠWindow Ġresize Ġsignal Ġ( 4 . 3 BSD , ĠSun ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ ĠAbstract Proc . sig Handler Ġ= Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġhandler ( sign um : ĠInt ) Ġ= Ġmap [ sign um ]?. send ( sign um ) ĊĊĠĠĠ Ġprivate Ġfun Ġadd ( handler : ĠSignal Handler ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( handler Ġin Ġhandlers ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" Handler Ġalready Ġadded .") ĊĊĠĠĠĠĠĠĠ Ġval Ġused Ġ= Ġhandler . signals . intersect ( signals ) ĊĠĠĠĠĠĠĠ Ġif Ġ( used . isNotEmpty ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalArgumentException (" Handler Ġsignals Ġalready Ġused Ġby Ġdifferent Ġhandler .") ĊĊĠĠĠĠĠĠĠ Ġhandlers . add ( handler ) ĊĠĠĠĠĠĠĠ Ġhandler . signals . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠProc . register Interrupt ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsignals . add ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmap [ it ] Ġ= Ġhandler ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġinstance Ġ= ĠSignal () ĊĊĠĠĠĠĠĠĠ Ġfun Ġregister ( handler : ĠSignal Handler ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinstance . add ( handler ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }