module Snap.Internal.Debug where
import Control.Monad.Trans
#ifdef DEBUG_TEST
import Control.DeepSeq
debug :: (MonadIO m) => String -> m ()
debug !s = let !s' = rnf s in return $! s' `deepseq` ()
debugErrno :: (MonadIO m) => String -> m ()
debugErrno !s = let !s' = rnf s in return $! s' `deepseq` ()
#elif defined(DEBUG)
import Control.Concurrent
import Data.List
import Data.Maybe
import Foreign.C.Error
import System.IO
import System.IO.Unsafe
import Text.Printf
_debugMVar :: MVar ()
_debugMVar = unsafePerformIO $ newMVar ()
debug :: (MonadIO m) => String -> m ()
debug s = liftIO $ withMVar _debugMVar $ \_ -> do
tid <- myThreadId
hPutStrLn stderr $ s' tid
hFlush stderr
where
chop x = let y = fromMaybe x $ stripPrefix "ThreadId " x
in printf "%8s" y
s' t = "[" ++ chop (show t) ++ "] " ++ s
debugErrno :: (MonadIO m) => String -> m ()
debugErrno loc = liftIO $ do
err <- getErrno
let ex = errnoToIOError loc err Nothing Nothing
debug $ show ex
#else
debug :: (MonadIO m) => String -> m ()
debug _ = return ()
debugErrno :: (MonadIO m) => String -> m ()
debugErrno _ = return ()
#endif