git.iko.soy/distributed-process
on master help sign in
Fix memory leak in ..Node.handleIncomingMessages
38eb752Edsko de Vries
distributed-process/src/Control/Distributed/Process/Node.hs+10−2
@@ -27,6 +27,8 @@ import qualified Data.Map as Map
27 , partitionWithKey
27 , partitionWithKey
28 , elems
28 , elems
29 , filterWithKey
29 , filterWithKey
30+ , findWithDefault
31+ , insert
30 )
32 )
31import Data.Set (Set)
33import Data.Set (Set)
32import qualified Data.Set as Set (empty, insert, delete, member)
34import qualified Data.Set as Set (empty, insert, delete, member)
@@ -293,7 +295,7 @@ incomingAt :: NT.ConnectionId -> Accessor ConnectionState (Maybe IncomingConnect
293incomingAt cid = incoming >>> DAC.mapMaybe cid
295incomingAt cid = incoming >>> DAC.mapMaybe cid
294
296
295incomingFrom :: NT.EndPointAddress -> Accessor ConnectionState (Set NT.ConnectionId)
297incomingFrom :: NT.EndPointAddress -> Accessor ConnectionState (Set NT.ConnectionId)
296−incomingFrom addr = aux >>> DAC.mapDefault Set.empty addr
298+incomingFrom addr = aux >>> strictMapDefault Set.empty addr
297 where
299 where
298 aux = accessor _incomingFrom (\fr st -> st { _incomingFrom = fr })
300 aux = accessor _incomingFrom (\fr st -> st { _incomingFrom = fr })
299
301
@@ -755,9 +757,15 @@ splitNotif :: Identifier
755splitNotif ident = Map.partitionWithKey (\k !_v -> ident `impliesDeathOf` k)
757splitNotif ident = Map.partitionWithKey (\k !_v -> ident `impliesDeathOf` k)
756
758
757--------------------------------------------------------------------------------
759--------------------------------------------------------------------------------
758−-- Strict evaluation of the state --
760+-- Auxiliary --
759--------------------------------------------------------------------------------
761--------------------------------------------------------------------------------
760
762
761-- | Modify and evaluate the state
763-- | Modify and evaluate the state
762modify' :: MonadState s m => (s -> s) -> m ()
764modify' :: MonadState s m => (s -> s) -> m ()
763modify' f = StateT.get >>= \s -> StateT.put $! f s
765modify' f = StateT.get >>= \s -> StateT.put $! f s
766+
767+-- | Strict lens for Map
768+strictMapDefault :: Ord key => elem -> key -> Accessor (Map key elem) elem
769+strictMapDefault def key =
770+ accessor (Map.findWithDefault def key)
771+ (\val -> val `seq` Map.insert key val)