From d187c97aa8fd1c5385a99a8b061793d7a000fadb Mon Sep 17 00:00:00 2001 From: Joe Crayne Date: Thu, 26 Dec 2019 18:43:54 -0500 Subject: Reverted 6ebe91b6: abandoning the async search design for now. --- kad/src/Network/Kademlia/Search.hs | 33 +++++++++++++-------------------- 1 file changed, 13 insertions(+), 20 deletions(-) (limited to 'kad') diff --git a/kad/src/Network/Kademlia/Search.hs b/kad/src/Network/Kademlia/Search.hs index 16786d1c..5b60c303 100644 --- a/kad/src/Network/Kademlia/Search.hs +++ b/kad/src/Network/Kademlia/Search.hs @@ -40,8 +40,7 @@ import GHC.Conc (labelThread) data Search nid addr tok ni r = Search { searchSpace :: KademliaSpace nid ni , searchNodeAddress :: ni -> addr - , searchQuery :: Either (nid -> ni -> IO (Maybe ([ni], [r], Maybe tok))) - (nid -> ni -> (Maybe ([ni],[r],Maybe tok) -> IO ()) -> IO ()) + , searchQuery :: nid -> ni -> IO (Maybe ([ni], [r], Maybe tok)) , searchAlpha :: Int -- α = 8 -- | 'searchK' should be larger than 'searchAlpha'. How much larger depends on -- how fast the queries are. For Tox's much slower onion-routed queries, we @@ -122,7 +121,7 @@ reset nearestNodes qsearch target st = do writeTVar (searchPendingCount st) 0 return st -sendAsyncQuery :: forall addr nid tok ni r. +sendQuery :: forall addr nid tok ni r. ( Ord addr , PSQKey nid , PSQKey ni @@ -133,23 +132,15 @@ sendAsyncQuery :: forall addr nid tok ni r. -> (r -> STM Bool) -- ^ return False to terminate the search. -> SearchState nid addr tok ni r -> Binding ni nid - -> TaskGroup -> IO () -sendAsyncQuery Search{..} searchTarget searchResult sch@SearchState{..} (ni :-> d) g = - case searchQuery of - Left blockingQuery -> - forkTask g "searchQuery" $ do - -- forkTask will label the thread. - -- -- myThreadId >>= flip labelThread ("searchQuery." ++ show searchTarget) - reply <- blockingQuery searchTarget ni `catchIOError` const (return Nothing) - atomically $ do - modifyTVar searchPendingCount pred - maybe (return ()) go reply - Right nonblockingQuery -> do - nonblockingQuery searchTarget ni $ \reply -> - atomically $ do - modifyTVar searchPendingCount pred - maybe (return ()) go reply +sendQuery Search{..} searchTarget searchResult sch@SearchState{..} (ni :-> d) = do + myThreadId >>= flip labelThread ("searchQuery." ++ show searchTarget) + reply <- searchQuery searchTarget ni `catchIOError` const (return Nothing) + -- (ns,rs) + let tok = error "TODO: token" + atomically $ do + modifyTVar searchPendingCount pred + maybe (return ()) go reply where go (ns,rs,tok) = do vs <- readTVar searchVisited @@ -239,7 +230,9 @@ searchLoop sch@Search{..} target result s@SearchState{..} = do modifyTVar searchVisited $ Set.insert (searchNodeAddress ni) modifyTVar searchPendingCount succ return $ do - sendAsyncQuery sch target result s (ni :-> d) g + forkTask g + "searchQuery" + $ sendQuery sch target result s (ni :-> d) again _ -> -- Otherwise, we are finished. do check (cnt == 0) -- cgit v1.2.3