Use an IORef rather than a MVar.

The job of a manager is to synchronize threads, so it is not necessary to block.
This commit is contained in:
Timo von Holtz 2015-03-05 09:49:15 +11:00
parent 1af0d7b5ab
commit aeb1136658

View file

@ -3,13 +3,13 @@
module Servant.Common.Req where module Servant.Common.Req where
import Control.Applicative import Control.Applicative
import Control.Concurrent
import Control.Exception import Control.Exception
import Control.Monad import Control.Monad
import Control.Monad.Catch (MonadThrow) import Control.Monad.Catch (MonadThrow)
import Control.Monad.IO.Class import Control.Monad.IO.Class
import Control.Monad.Trans.Either import Control.Monad.Trans.Either
import Data.ByteString.Lazy hiding (pack, filter, map, null) import Data.ByteString.Lazy hiding (pack, filter, map, null)
import Data.IORef
import Data.String import Data.String
import Data.String.Conversions import Data.String.Conversions
import Data.Proxy import Data.Proxy
@ -98,13 +98,11 @@ reqToRequest req (BaseUrl reqScheme reqHost reqPort) =
-- * performing requests -- * performing requests
{-# NOINLINE __manager #-} {-# NOINLINE __manager #-}
__manager :: MVar Manager __manager :: IORef Manager
__manager = unsafePerformIO (newManager tlsManagerSettings >>= newMVar) __manager = unsafePerformIO (newManager tlsManagerSettings >>= newIORef)
__withGlobalManager :: (Manager -> IO a) -> IO a __withGlobalManager :: (Manager -> IO a) -> IO a
__withGlobalManager action = modifyMVar __manager $ \ manager -> do __withGlobalManager action = readIORef __manager >>= action
result <- action manager
return (manager, result)
displayHttpRequest :: Method -> String displayHttpRequest :: Method -> String