Fix buffering problem when GHCi is using the new IO library
authorSimon Marlow <marlowsd@gmail.com>
Tue, 23 Jun 2009 14:26:23 +0000 (14:26 +0000)
committerSimon Marlow <marlowsd@gmail.com>
Tue, 23 Jun 2009 14:26:23 +0000 (14:26 +0000)
Behind the scenes, the new IO library always does buffering for read
Handles regardless of NoBuffering.  Normally this isn't visible, but
it causes a problem in GHCi where there are two stdin Handles.

This should fix those ghci test failures that sprung up in full
testsuite runs recently.

ghc/InteractiveUI.hs

index 82c9aab..0e9efb6 100644 (file)
@@ -96,6 +96,7 @@ import GHC.Exts               ( unsafeCoerce# )
 
 #if __GLASGOW_HASKELL__ >= 611
 import GHC.IO.Exception        ( IOErrorType(InvalidArgument) )
+import GHC.IO.Handle    ( hFlushAll )
 #else
 import GHC.IOBase      ( IOErrorType(InvalidArgument) )
 #endif
@@ -636,7 +637,16 @@ runStmt stmt step
  | null (filter (not.isSpace) stmt) = return False
  | ["import", mod] <- words stmt    = keepGoing' setContext ('+':mod)
  | otherwise
- = do result <- GhciMonad.runStmt stmt step
+ = do
+#if __GLASGOW_HASKELL__ >= 611
+      -- In the new IO library, read handles buffer data even if the Handle
+      -- is set to NoBuffering.  This causes problems for GHCi where there
+      -- are really two stdin Handles.  So we flush any bufferred data in
+      -- GHCi's stdin Handle here (only relevant if stdin is attached to
+      -- a file, otherwise the read buffer can't be flushed).
+      liftIO $ IO.try $ hFlushAll stdin
+#endif
+      result <- GhciMonad.runStmt stmt step
       afterRunStmt (const True) result
 
 --afterRunStmt :: GHC.RunResult -> GHCi Bool