@@ -156,24 +156,34 @@ apiNewEndPoint state = handle (return . Left) $ atomically $ do
156156 TransportError ResolveMulticastGroupUnsupported " Multicast not supported"
157157
158158apiCloseEndPoint :: 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.
179189apiBreakConnection :: TVar TransportState
0 commit comments