From 679e3d7ded733f0171723236e14f28832bfdff65 Mon Sep 17 00:00:00 2001 From: Olivier Nicole Date: Mon, 21 Aug 2017 17:35:05 +0200 Subject: [PATCH] Make serverRequestCall interruptible (#30) Instead of making a blocking foreign call without a timeout, we set a timeout of one second. This way, the thread returns in Haskell code (and thus is interruptible) at least every second. This is useful in order to be able to kill `Server`s, see https://github.com/awakesecurity/gRPC-haskell/issues/22. --- .../GRPC/LowLevel/CompletionQueue/Unregistered.hs | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/Network/GRPC/LowLevel/CompletionQueue/Unregistered.hs b/src/Network/GRPC/LowLevel/CompletionQueue/Unregistered.hs index d4643ab..f73c4c0 100644 --- a/src/Network/GRPC/LowLevel/CompletionQueue/Unregistered.hs +++ b/src/Network/GRPC/LowLevel/CompletionQueue/Unregistered.hs @@ -50,7 +50,14 @@ serverRequestCall s scq ccq = runExceptT $ case ce of C.CallOk -> do ExceptT $ do - r <- pluck' scq tag Nothing + let + rec = do + -- yield every second, for interruptibility + r <- pluck' scq tag (Just 1) + case r of + Left GRPCIOTimeout -> rec + _ -> return r + r <- rec dbug $ "pluck' finished: " ++ show r return r lift $