uninterruptibleMask +base

uninterruptibleMask :: ((forall a. IO a -> IO a) -> IO b) -> IO b
base Control.Exception.Base, base Control.Exception
Like mask, but the masked computation is not interruptible (see Control.Exception#interruptible). THIS SHOULD BE USED WITH GREAT CARE, because if a thread executing in uninterruptibleMask blocks for any reason, then the thread (and possibly the program, if this is the main thread) will be unresponsive and unkillable. This function should only be necessary if you need to mask exceptions around an interruptible operation, and you can guarantee that the interruptible operation will only block for a short period of time.
uninterruptibleMask_ :: IO a -> IO a
base Control.Exception.Base, base Control.Exception
Like uninterruptibleMask, but does not pass a restore action to the argument.