diff options
Diffstat (limited to 'src/Network/SessionTransports.hs')
-rw-r--r-- | src/Network/SessionTransports.hs | 33 |
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)) |
53 | newSession Sessions{sessionsByAddr,sessionsById,sessionIds,sessionsSendRaw} unwrap wrap addr0 = do | 53 | newSession 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 | ||
88 | sessionHandler :: Sessions x -> (SockAddr -> x -> IO (Maybe (x -> x))) | 89 | sessionHandler :: Sessions x -> (SockAddr -> x -> IO (Maybe (x -> x))) |
89 | sessionHandler Sessions{sessionsByAddr} = \addr0 x -> do | 90 | sessionHandler Sessions{sessionsByAddr} = \addr0 x -> do |