multithreading haskell exception concurrency exception-handling

multithreading - Excepciones concurrentes de Haskell



exception concurrency (1)

No hay correspondencia automática entre las señales POSIX y las excepciones de Haskell.

Para que una señal se convierta en una excepción, es necesario que haya un controlador de señales que haga exactamente eso: lanzar una excepción a uno de los subprocesos de Haskell. El subproceso en el que se obtiene la excepción depende completamente de la configuración del manejador de señales

De forma predeterminada, GHC configura dicho controlador solo para SIGINT, y esa señal entrega la excepción al hilo principal.

Puede instalar controladores similares para las otras señales :

import Control.Concurrent (mkWeakThreadId, myThreadId) import Control.Exception (Exception(..), throwTo) import Control.Monad (forM_) import Data.Typeable (Typeable) import System.Posix.Signals import System.Mem.Weak (deRefWeak) newtype SignalException = SignalException Signal deriving (Show, Typeable) instance Exception SignalException installSignalHandlers :: IO () installSignalHandlers = do main_thread_id <- myThreadId weak_tid <- mkWeakThreadId main_thread_id forM_ [ sigABRT, sigBUS, sigFPE, sigHUP, sigILL, sigQUIT, sigSEGV, sigSYS, sigTERM, sigUSR1, sigUSR2, sigXCPU, sigXFSZ ] $ /sig -> installHandler sig (Catch $ send_exception weak_tid sig) Nothing where send_exception weak_tid sig = do m <- deRefWeak weak_tid case m of Nothing -> return () Just tid -> throwTo tid (toException $ SignalException sig) main = do installSignalHandlers ...

Pero también puede ser creativo y cambiar el controlador para enviar la señal a algún otro hilo. Por ejemplo, si solo hay un subproceso que trabaja con sockets, puede asegurarse de que el subproceso obtenga la excepción. O, dependiendo de la señal en la que esté interesado, tal vez pueda averiguar el hilo relevante en base a la estructura siginfo_t (vea sigaction(2) ) - ¿quizás el campo si_fd?

¿Cómo se entregan las excepciones en un programa de Haskell concurrente?

Digamos que tenemos un proceso, con varios subprocesos y uno de ellos está interactuando con algo a través de una conexión TCP y obtenemos una señal (digamos en un sistema * nix).

¿A qué hilo (verde) se enviará esta señal?

¿Se entregará al que está "usando" el socket o recibirá un subproceso designado "principal" y tiene que hacer un throwTo explícitamente para enviar la excepción a ese subproceso (verde)?