content: module Network.Wai.Logger.Prefork (
      logCheck,
      logInit,
      logController,
      LogController,
      LogType (..),
      FileLogSpec (..),
      LogFlusher,
  ) where
  
  import Control.Concurrent
  import Control.Monad
  import Network.Wai.Logger
  import Network.Wai.Logger.Prefork.File
  import Network.Wai.Logger.Prefork.Types
  import System.Date.Cache
  import System.Log.FastLogger
  
  -- |
  -- Checking if a log file can be written if 'LogType' is 'LogFile'.
  logCheck :: LogType -> IO ()
  logCheck LogNone = return ()
  logCheck LogStdout = return ()
  logCheck (LogFile spec _) = check spec
  
  -- |
  -- Creating 'ApacheLogger' according to 'LogType'.
  logInit :: IPAddrSource -> LogType -> IO (ApacheLogger, LogFlusher)
  logInit _ LogNone = noLoggerInit
  logInit ipsrc LogStdout = stdoutLoggerInit ipsrc
  logInit ipsrc (LogFile spec signal) = fileLoggerInit ipsrc spec signal
  
  noLoggerInit :: IO (ApacheLogger, LogFlusher)
  noLoggerInit = return $! (noLogger, noFlusher)
    where
      noLogger _ _ _ = return ()
      noFlusher = return ()
  
  stdoutLoggerInit :: IPAddrSource -> IO (ApacheLogger, LogFlusher)
  stdoutLoggerInit ipsrc = do
      dc <- clockDateCacher zonedDateCacheConf
      lgr <- stdoutApacheLoggerInit2 ipsrc True dc
      return $! (lgr, return ())
  
  -- |
  -- Creating a log controller against child processes.
  logController :: LogType -> LogController
  logController LogNone = noLoggerController
  logController LogStdout = noLoggerController
  logController (LogFile spec signal) = fileLoggerController spec signal
  
  noLoggerController :: LogController
  noLoggerController _ = forever $ threadDelay maxBound
  