From ce8a1546bdcfbbb7c45407e3811cafc99d667ee1 Mon Sep 17 00:00:00 2001 From: Sam Truzjan Date: Sun, 22 Dec 2013 05:08:51 +0400 Subject: Run each handler in separate thread. This is needed because handler can call query too. The minimal example: * listener received KQuery(1); * listener dispatch corresponding handler; * handler send KQuery(2); * handler blocked waiting for response; * listener is unable to receive KQuery(2) because it is blocked on handler. So we should run each handler in separated thread otherwise dead lock can happen. --- src/Network/KRPC/Manager.hs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/Network') diff --git a/src/Network/KRPC/Manager.hs b/src/Network/KRPC/Manager.hs index c63967d0..084a8d8d 100644 --- a/src/Network/KRPC/Manager.hs +++ b/src/Network/KRPC/Manager.hs @@ -192,7 +192,7 @@ dispatchHandler q @ KQuery {..} addr = do -----------------------------------------------------------------------} handleQuery :: MonadKRPC h m => KQuery -> SockAddr -> m () -handleQuery q addr = do +handleQuery q addr = void $ fork $ do Manager {..} <- getManager res <- dispatchHandler q addr sendMessage sock addr $ either toBEncode toBEncode res -- cgit v1.2.3