summaryrefslogtreecommitdiff
path: root/src/Network/SessionTransports.hs
diff options
context:
space:
mode:
Diffstat (limited to 'src/Network/SessionTransports.hs')
-rw-r--r--src/Network/SessionTransports.hs33
1 files changed, 17 insertions, 16 deletions
diff --git a/src/Network/SessionTransports.hs b/src/Network/SessionTransports.hs
index 17763e4e..e9daf6c1 100644
--- a/src/Network/SessionTransports.hs
+++ b/src/Network/SessionTransports.hs
@@ -49,7 +49,7 @@ newSession :: Sessions raw
49 -> (addr -> y -> IO raw) 49 -> (addr -> y -> IO raw)
50 -> (SockAddr -> raw -> IO (Maybe (x, addr))) 50 -> (SockAddr -> raw -> IO (Maybe (x, addr)))
51 -> SockAddr 51 -> SockAddr
52 -> IO (Maybe (TransportA err addr x y)) 52 -> IO (Maybe (Int,TransportA err addr x y))
53newSession Sessions{sessionsByAddr,sessionsById,sessionIds,sessionsSendRaw} unwrap wrap addr0 = do 53newSession Sessions{sessionsByAddr,sessionsById,sessionIds,sessionsSendRaw} unwrap wrap addr0 = do
54 mvar <- newEmptyMVar 54 mvar <- newEmptyMVar
55 let saddr = -- Canonical in case of 6-mapped-4 addresses. 55 let saddr = -- Canonical in case of 6-mapped-4 addresses.
@@ -69,21 +69,22 @@ newSession Sessions{sessionsByAddr,sessionsById,sessionIds,sessionsSendRaw} unwr
69 $ IntMap.singleton sid handlePacket 69 $ IntMap.singleton sid handlePacket
70 return sid 70 return sid
71 forM msid $ \sid -> do 71 forM msid $ \sid -> do
72 return Transport 72 let tr = Transport
73 { awaitMessage = \kont -> do 73 { awaitMessage = \kont -> do
74 x <- takeMVar mvar 74 x <- takeMVar mvar
75 kont $! Right <$> x 75 kont $! Right <$> x
76 , sendMessage = \addr x -> do 76 , sendMessage = \addr x -> do
77 x' <- unwrap addr x 77 x' <- unwrap addr x
78 sessionsSendRaw saddr x' 78 sessionsSendRaw saddr x'
79 , closeTransport = do 79 , closeTransport = do
80 tryTakeMVar mvar 80 tryTakeMVar mvar
81 putMVar mvar Nothing 81 putMVar mvar Nothing
82 atomically $ do 82 atomically $ do
83 modifyTVar' sessionIds $ S.delete sid 83 modifyTVar' sessionIds $ S.delete sid
84 modifyTVar' sessionsById $ IntMap.delete sid 84 modifyTVar' sessionsById $ IntMap.delete sid
85 modifyTVar' sessionsByAddr $ Map.alter (rmSession sid) saddr 85 modifyTVar' sessionsByAddr $ Map.alter (rmSession sid) saddr
86 } 86 }
87 return (sid,tr)
87 88
88sessionHandler :: Sessions x -> (SockAddr -> x -> IO (Maybe (x -> x))) 89sessionHandler :: Sessions x -> (SockAddr -> x -> IO (Maybe (x -> x)))
89sessionHandler Sessions{sessionsByAddr} = \addr0 x -> do 90sessionHandler Sessions{sessionsByAddr} = \addr0 x -> do