Skip to content

Commit 5580cdb

Browse files
committed
Fix disconnect remote endpoints on close endpoint
1 parent 1fa4f51 commit 5580cdb

File tree

1 file changed

+28
-18
lines changed
  • packages/network-transport-inmemory/src/Network/Transport/InMemory

1 file changed

+28
-18
lines changed

packages/network-transport-inmemory/src/Network/Transport/InMemory/Internal.hs

Lines changed: 28 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -156,24 +156,34 @@ apiNewEndPoint state = handle (return . Left) $ atomically $ do
156156
TransportError ResolveMulticastGroupUnsupported "Multicast not supported"
157157

158158
apiCloseEndPoint :: TVar TransportState -> EndPointAddress -> IO ()
159-
apiCloseEndPoint state addr = atomically $ whenValidTransportState state $ \vst ->
160-
forM_ (vst ^. localEndPointAt addr) $ \lep -> do
161-
old <- swapTVar (localEndPointState lep) LocalEndPointClosed
162-
case old of
163-
LocalEndPointClosed -> return ()
164-
LocalEndPointValid lepvst -> do
165-
forM_ (Map.elems (lepvst ^. connections)) $ \lconn -> do
166-
st <- swapTVar (localConnectionState lconn) LocalConnectionClosed
167-
case st of
168-
LocalConnectionClosed -> return ()
169-
LocalConnectionFailed -> return ()
170-
_ -> forM_ (vst ^. localEndPointAt (localConnectionRemoteAddress lconn)) $ \thep ->
171-
whenValidLocalEndPointState thep $ \_ -> do
172-
writeTChan (localEndPointChannel thep)
173-
(ConnectionClosed (localConnectionId lconn))
174-
writeTChan (localEndPointChannel lep) EndPointClosed
175-
writeTVar (localEndPointState lep) LocalEndPointClosed
176-
writeTVar state (TransportValid $ (localEndPoints ^: Map.delete addr) vst)
159+
apiCloseEndPoint state addr = atomically $ whenValidTransportState state $ \vst -> do
160+
161+
forM_ (Map.toList $ _localEndPoints vst) $
162+
\(theirAddr, lep) -> do
163+
164+
if theirAddr == addr
165+
then do
166+
old <- swapTVar (localEndPointState lep) LocalEndPointClosed
167+
case old of
168+
LocalEndPointClosed -> return ()
169+
LocalEndPointValid lepvst -> do
170+
forM_ (Map.elems (lepvst ^. connections)) $ \lconn -> do
171+
st <- swapTVar (localConnectionState lconn) LocalConnectionClosed
172+
case st of
173+
LocalConnectionClosed -> return ()
174+
LocalConnectionFailed -> return ()
175+
_ -> do
176+
forM_ (vst ^. localEndPointAt (localConnectionRemoteAddress lconn)) $ \thep ->
177+
whenValidLocalEndPointState thep $ \_ -> do
178+
writeTChan (localEndPointChannel thep)
179+
(ConnectionClosed (localConnectionId lconn))
180+
writeTChan (localEndPointChannel lep) EndPointClosed
181+
writeTVar (localEndPointState lep) LocalEndPointClosed
182+
183+
else do
184+
apiBreakConnection state addr theirAddr "remote endpoint disconnected"
185+
186+
writeTVar state (TransportValid $ (localEndPoints ^: Map.delete addr) vst)
177187

178188
-- | Tear down functions that should be called in case if conncetion fails.
179189
apiBreakConnection :: TVar TransportState

0 commit comments

Comments
 (0)