Use atomicModifyIORef instead of readIORef.
<http://hackage.haskell.org/package/base-4.8.0.0/docs/Data-IORef.html#g:2>
This commit is contained in:
parent
060187f997
commit
adf97f5d07
@ -60,7 +60,7 @@ sessionStore state =
|
|||||||
(sessionMap, saveSessionToken) <- loadSession state mcookieVal
|
(sessionMap, saveSessionToken) <- loadSession state mcookieVal
|
||||||
sessionRef <- I.newIORef sessionMap
|
sessionRef <- I.newIORef sessionMap
|
||||||
let save = do
|
let save = do
|
||||||
sessionMap' <- I.readIORef sessionRef
|
sessionMap' <- I.atomicModifyIORef' sessionRef $ \a -> (a, a)
|
||||||
session <- saveSession state saveSessionToken sessionMap'
|
session <- saveSession state saveSessionToken sessionMap'
|
||||||
return $ TE.encodeUtf8 $ toPathPiece $ sessionKey session
|
return $ TE.encodeUtf8 $ toPathPiece $ sessionKey session
|
||||||
return (mkSession sessionRef, save)
|
return (mkSession sessionRef, save)
|
||||||
@ -70,7 +70,10 @@ sessionStore state =
|
|||||||
-- session data.
|
-- session data.
|
||||||
mkSession :: MonadIO m => I.IORef SessionMap -> WS.Session m Text ByteString
|
mkSession :: MonadIO m => I.IORef SessionMap -> WS.Session m Text ByteString
|
||||||
mkSession sessionRef =
|
mkSession sessionRef =
|
||||||
( \k -> M.lookup k <$> liftIO (I.readIORef sessionRef)
|
-- We need to use atomicModifyIORef instead of readIORef
|
||||||
|
-- because latter may be reordered (cf. "Memory Model" on
|
||||||
|
-- Data.IORef's documentation).
|
||||||
|
( \k -> M.lookup k <$> liftIO (I.atomicModifyIORef' sessionRef $ \a -> (a, a))
|
||||||
, \k v -> liftIO (I.atomicModifyIORef' sessionRef $ flip (,) () . M.insert k v)
|
, \k v -> liftIO (I.atomicModifyIORef' sessionRef $ flip (,) () . M.insert k v)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@ -286,7 +286,10 @@ instance Storage MockStorage where
|
|||||||
type TransactionM MockStorage = IO
|
type TransactionM MockStorage = IO
|
||||||
runTransactionM _ = id
|
runTransactionM _ = id
|
||||||
getSession sto sid =
|
getSession sto sid =
|
||||||
M.lookup sid <$> I.readIORef (mockSessions sto)
|
-- We need to use atomicModifyIORef instead of readIORef
|
||||||
|
-- because latter may be reordered (cf. "Memory Model" on
|
||||||
|
-- Data.IORef's documentation).
|
||||||
|
M.lookup sid <$> I.atomicModifyIORef' (mockSessions sto) (\a -> (a, a))
|
||||||
deleteSession sto sid =
|
deleteSession sto sid =
|
||||||
I.modifyIORef (mockSessions sto) (M.delete sid)
|
I.modifyIORef (mockSessions sto) (M.delete sid)
|
||||||
deleteAllSessionsOfAuthId sto authId =
|
deleteAllSessionsOfAuthId sto authId =
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user