summaryrefslogtreecommitdiff
path: root/src/Network
diff options
context:
space:
mode:
Diffstat (limited to 'src/Network')
-rw-r--r--src/Network/BitTorrent.hs4
-rw-r--r--src/Network/BitTorrent/Exchange.hs39
-rw-r--r--src/Network/BitTorrent/Internal.hs5
3 files changed, 26 insertions, 22 deletions
diff --git a/src/Network/BitTorrent.hs b/src/Network/BitTorrent.hs
index b6e2eadf..95a4c4e3 100644
--- a/src/Network/BitTorrent.hs
+++ b/src/Network/BitTorrent.hs
@@ -102,7 +102,7 @@ defaultClient = newClient defaultThreadCount defaultExtensions
102-- thus we can obtain an unified interface 102-- thus we can obtain an unified interface
103 103
104discover :: SwarmSession -> P2P () -> IO () 104discover :: SwarmSession -> P2P () -> IO ()
105discover swarm action = do 105discover swarm action = {-# SCC discover #-} do
106 port <- forkListener (error "discover") 106 port <- forkListener (error "discover")
107 107
108 let conn = TConnection (tAnnounce (torrentMeta swarm)) 108 let conn = TConnection (tAnnounce (torrentMeta swarm))
@@ -134,7 +134,7 @@ discover swarm action = do
134 134
135-- | Default P2P action. 135-- | Default P2P action.
136exchange :: Storage -> P2P () 136exchange :: Storage -> P2P ()
137exchange storage = awaitEvent >>= handler 137exchange storage = {-# SCC exchange #-} (awaitEvent >>= handler)
138 where 138 where
139 handler (Available bf) = do 139 handler (Available bf) = do
140 liftIO (print (completeness bf)) 140 liftIO (print (completeness bf))
diff --git a/src/Network/BitTorrent/Exchange.hs b/src/Network/BitTorrent/Exchange.hs
index 66112f14..9f119d13 100644
--- a/src/Network/BitTorrent/Exchange.hs
+++ b/src/Network/BitTorrent/Exchange.hs
@@ -110,17 +110,21 @@ runPeerWire sock p2p =
110 sinkSocket sock 110 sinkSocket sock
111 111
112awaitMessage :: P2P Message 112awaitMessage :: P2P Message
113awaitMessage = P2P $ ReaderT $ const go 113awaitMessage = P2P $ ReaderT $ const $ {-# SCC awaitMessage #-} go
114 where 114 where
115 go = await >>= maybe (monadThrow PeerDisconnected) return 115 go = await >>= maybe (monadThrow PeerDisconnected) return
116{-# INLINE awaitMessage #-} 116{-# INLINE awaitMessage #-}
117 117
118yieldMessage :: Message -> P2P () 118yieldMessage :: Message -> P2P ()
119yieldMessage msg = P2P $ ReaderT $ const (C.yield msg) 119yieldMessage msg = P2P $ ReaderT $ const $ {-# SCC yieldMessage #-} C.yield msg
120{-# INLINE yieldMessage #-} 120{-# INLINE yieldMessage #-}
121 121
122flushPending :: P2P () 122flushPending :: P2P ()
123flushPending = ask >>= liftIO . getPending >>= mapM_ yieldMessage 123flushPending = {-# SCC flushPending #-} do
124 se <- ask
125 q <- liftIO (getPending se)
126 -- TODO send vectored
127 mapM_ yieldMessage q
124 128
125{----------------------------------------------------------------------- 129{-----------------------------------------------------------------------
126 P2P monad 130 P2P monad
@@ -321,7 +325,7 @@ data Event
321-- forall (Fragment block). isPiece block == True 325-- forall (Fragment block). isPiece block == True
322-- 326--
323awaitEvent :: P2P Event 327awaitEvent :: P2P Event
324awaitEvent = awaitMessage >>= go 328awaitEvent = {-# SCC awaitEvent #-} awaitMessage >>= go
325 where 329 where
326 go KeepAlive = awaitEvent 330 go KeepAlive = awaitEvent
327 go Choke = do 331 go Choke = do
@@ -439,22 +443,21 @@ awaitEvent = awaitMessage >>= go
439-- most likely will be ignored without any network IO. 443-- most likely will be ignored without any network IO.
440-- 444--
441yieldEvent :: Event -> P2P () 445yieldEvent :: Event -> P2P ()
442yieldEvent (Available ixs) = asks swarmSession >>= liftIO . available ixs 446yieldEvent e = {-# SCC yieldEvent #-} go e
443yieldEvent (Want bix) = do 447 where
444 offer <- peerOffer 448 go (Available ixs) = asks swarmSession >>= liftIO . available ixs
445 if ixPiece bix `BF.member` offer 449 go (Want bix) = do
446 then yieldMessage (Request bix) 450 offer <- peerOffer
447 else return () 451 if ixPiece bix `BF.member` offer
452 then yieldMessage (Request bix)
453 else return ()
448 454
449yieldEvent (Fragment blk) = do 455 go (Fragment blk) = do
450 offer <- clientOffer 456 offer <- clientOffer
451 if blkPiece blk `BF.member` offer 457 if blkPiece blk `BF.member` offer
452 then yieldMessage (Piece blk) 458 then yieldMessage (Piece blk)
453 else return () 459 else return ()
454 460
455 461
456handleEvent :: (Event -> P2P Event) -> P2P () 462handleEvent :: (Event -> P2P Event) -> P2P ()
457handleEvent action = awaitEvent >>= action >>= yieldEvent 463handleEvent action = awaitEvent >>= action >>= yieldEvent
458
459checkPiece :: PieceLIx -> {-ByteString -> -} P2P Bool
460checkPiece = undefined
diff --git a/src/Network/BitTorrent/Internal.hs b/src/Network/BitTorrent/Internal.hs
index eaeb04e8..5a7e493f 100644
--- a/src/Network/BitTorrent/Internal.hs
+++ b/src/Network/BitTorrent/Internal.hs
@@ -538,7 +538,7 @@ findPieceCount = pieceCount . tInfo . torrentMeta . swarmSession
538-- 3. Signal to the all other peer about this. 538-- 3. Signal to the all other peer about this.
539 539
540available :: Bitfield -> SwarmSession -> IO () 540available :: Bitfield -> SwarmSession -> IO ()
541available bf se @ SwarmSession {..} = do 541available bf se @ SwarmSession {..} = {-# SCC available #-} do
542 mark >> atomically broadcast 542 mark >> atomically broadcast
543 where 543 where
544 mark = do 544 mark = do
@@ -561,7 +561,8 @@ available bf se @ SwarmSession {..} = do
561-- changed client state. Resulting queue should be sent to a peer 561-- changed client state. Resulting queue should be sent to a peer
562-- immediately. 562-- immediately.
563getPending :: PeerSession -> IO [Message] 563getPending :: PeerSession -> IO [Message]
564getPending PeerSession {..} = atomically (readAvail pendingMessages) 564getPending PeerSession {..} = {-# SCC getPending #-} do
565 atomically (readAvail pendingMessages)
565 566
566readAvail :: TChan a -> STM [a] 567readAvail :: TChan a -> STM [a]
567readAvail chan = do 568readAvail chan = do