From 5b19865c7a002b33400ea0431e569cb8f945aaa3 Mon Sep 17 00:00:00 2001 From: Felipe Lessa Date: Mon, 27 Aug 2012 10:20:17 -0300 Subject: [PATCH] yesod-core: In handlerToIO, really avoid keeping old handler data in memory. --- yesod-core/Yesod/Handler.hs | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/yesod-core/Yesod/Handler.hs b/yesod-core/Yesod/Handler.hs index 811d8f54..f6314df7 100644 --- a/yesod-core/Yesod/Handler.hs +++ b/yesod-core/Yesod/Handler.hs @@ -438,6 +438,12 @@ handlerToIO = newWaiReq = oldWaiReq { W.requestBody = mempty } newReq = oldReq { reqWaiRequest = newWaiReq , reqBodySize = 0 } + clearedOldHandlerData = + oldHandlerData { handlerRequest = err "handlerRequest never here" + , handlerState = err "handlerState never here" } + where + err :: String -> a + err = error . ("handlerToIO: clearedOldHandlerData/" ++) newState <- liftIO $ do oldState <- I.readIORef (handlerState oldHandlerData) return $ oldState { ghsRBC = Nothing @@ -450,8 +456,9 @@ handlerToIO = -- The state IORef needs to be created here, otherwise it -- will be shared by different invocations of this function. newStateIORef <- I.newIORef newState - runResourceT $ f oldHandlerData { handlerRequest = newReq - , handlerState = newStateIORef } + runResourceT $ f clearedOldHandlerData + { handlerRequest = newReq + , handlerState = newStateIORef } -- | Function used internally by Yesod in the process of converting a