Wait for the server to exit cleanly
authorLuke Lau <luke_lau@icloud.com>
Wed, 10 Jun 2020 13:41:04 +0000 (14:41 +0100)
committerLuke Lau <luke_lau@icloud.com>
Wed, 10 Jun 2020 13:41:04 +0000 (14:41 +0100)
Fixes #70

src/Language/Haskell/LSP/Test/Session.hs

index 9076a8e5e02e9ed819479a7d10c2f3a2d4ffc21a..2a0eb08c0f6cdb604894ea46220081ba91864240 100644 (file)
@@ -71,7 +71,7 @@ import Language.Haskell.LSP.Test.Exceptions
 import System.Console.ANSI
 import System.Directory
 import System.IO
-import System.Process (ProcessHandle())
+import System.Process (waitForProcess, ProcessHandle())
 import System.Timeout
 
 -- | A session representing one instance of launching and connecting to a server.
@@ -264,12 +264,15 @@ runSessionWithHandles serverIn serverOut serverProc serverHandler config caps ro
       serverListenerLauncher =
         forkIO $ catch (serverHandler serverOut context) errorHandler
       server = (Just serverIn, Just serverOut, Nothing, serverProc)
+      msgTimeoutMs = messageTimeout config * 10^6
       serverAndListenerFinalizer tid = do
-        finally (timeout (messageTimeout config * 1^6)
-                         (runSession' exitServer))
+        finally (timeout msgTimeoutMs (runSession' exitServer)) $ do
           -- Make sure to kill the listener first, before closing
           -- handles etc via cleanupProcess
-                (killThread tid >> cleanupProcess server)
+          killThread tid
+          -- Give the server some time to exit cleanly
+          timeout msgTimeoutMs (waitForProcess serverProc)
+          cleanupProcess server
 
   (result, _) <- bracket serverListenerLauncher
                          serverAndListenerFinalizer