diff options
Diffstat (limited to 'kad/src/Network/Kademlia/Search.hs')
-rw-r--r-- | kad/src/Network/Kademlia/Search.hs | 9 |
1 files changed, 6 insertions, 3 deletions
diff --git a/kad/src/Network/Kademlia/Search.hs b/kad/src/Network/Kademlia/Search.hs index 5b60c303..856a7cfc 100644 --- a/kad/src/Network/Kademlia/Search.hs +++ b/kad/src/Network/Kademlia/Search.hs | |||
@@ -194,12 +194,15 @@ search :: | |||
194 | , PSQKey nid | 194 | , PSQKey nid |
195 | , PSQKey ni | 195 | , PSQKey ni |
196 | , Show nid | 196 | , Show nid |
197 | ) => Search nid addr tok ni r -> R.BucketList ni -> nid -> (r -> STM Bool) -> IO (SearchState nid addr tok ni r) | 197 | ) => Search nid addr tok ni r -> R.BucketList ni -> nid -> (r -> STM Bool) -> IO (SearchState nid addr tok ni r, ThreadId) |
198 | search sch buckets target result = do | 198 | search sch buckets target result = do |
199 | let ns = R.kclosest (searchSpace sch) (searchK sch) target buckets | 199 | let ns = R.kclosest (searchSpace sch) (searchK sch) target buckets |
200 | st <- atomically $ newSearch sch target ns | 200 | st <- atomically $ newSearch sch target ns |
201 | t <- forkIO $ searchLoop sch target result st | 201 | v <- newTVarIO False |
202 | return st | 202 | t <- forkIO $ atomically (check =<< readTVar v) >> searchLoop sch target result st |
203 | labelThread t ("search.pending." ++ show target) | ||
204 | atomically $ writeTVar v True | ||
205 | return (st,t) | ||
203 | 206 | ||
204 | searchLoop :: ( Ord addr, Ord nid, Ord ni, Show nid, Hashable nid, Hashable ni ) | 207 | searchLoop :: ( Ord addr, Ord nid, Ord ni, Show nid, Hashable nid, Hashable ni ) |
205 | => Search nid addr tok ni r -- ^ Query and distance methods. | 208 | => Search nid addr tok ni r -- ^ Query and distance methods. |