1 {-# OPTIONS_GHC -fno-warn-unused-matches #-}
2 {-# OPTIONS_GHC -fno-warn-name-shadowing #-}
3 {-# OPTIONS_HADDOCK hide #-}
4 {-# LANGUAGE NoImplicitPrelude, RecordWildCards, BangPatterns #-}
6 -----------------------------------------------------------------------------
8 -- Module : GHC.IO.Handle.Internals
9 -- Copyright : (c) The University of Glasgow, 1994-2001
10 -- License : see libraries/base/LICENSE
12 -- Maintainer : libraries@haskell.org
13 -- Stability : internal
14 -- Portability : non-portable
16 -- This module defines the basic operations on I\/O \"handles\". All
17 -- of the operations defined here are independent of the underlying
20 -----------------------------------------------------------------------------
23 module GHC.IO.Handle.Internals (
24 withHandle, withHandle', withHandle_,
25 withHandle__', withHandle_', withAllHandles__,
26 wantWritableHandle, wantReadableHandle, wantReadableHandle_,
29 mkHandle, mkFileHandle, mkDuplexHandle,
30 openTextEncoding, closeTextCodecs, initBufferState,
31 dEFAULT_CHAR_BUFFER_SIZE,
33 flushBuffer, flushWriteBuffer, flushCharReadBuffer,
34 flushCharBuffer, flushByteReadBuffer, flushByteWriteBuffer,
36 readTextDevice, writeCharBuffer, readTextDeviceNonBlocking,
40 ioe_closedHandle, ioe_EOF, ioe_notReadable, ioe_notWritable,
41 ioe_finalizedHandle, ioe_bufsiz,
43 hClose_help, hLookAhead_,
45 HandleFinalizer, handleFinalizer,
52 import GHC.IO.Encoding as Encoding
53 import GHC.IO.Handle.Types
55 import GHC.IO.BufferedIO (BufferedIO)
56 import GHC.IO.Exception
57 import GHC.IO.Device (IODevice, SeekMode(..))
58 import qualified GHC.IO.Device as IODevice
59 import qualified GHC.IO.BufferedIO as Buffered
65 import GHC.Num ( Num(..) )
72 import Foreign hiding (unsafePerformIO)
73 -- import System.IO.Error
74 import System.Posix.Internals hiding (FD)
81 -- ---------------------------------------------------------------------------
82 -- Creating a new handle
84 type HandleFinalizer = FilePath -> MVar Handle__ -> IO ()
86 newFileHandle :: FilePath -> Maybe HandleFinalizer -> Handle__ -> IO Handle
87 newFileHandle filepath mb_finalizer hc = do
90 Just finalizer -> addMVarFinalizer m (finalizer filepath m)
92 return (FileHandle filepath m)
94 -- ---------------------------------------------------------------------------
95 -- Working with Handles
98 In the concurrent world, handles are locked during use. This is done
99 by wrapping an MVar around the handle which acts as a mutex over
100 operations on the handle.
102 To avoid races, we use the following bracketing operations. The idea
103 is to obtain the lock, do some operation and replace the lock again,
104 whether the operation succeeded or failed. We also want to handle the
105 case where the thread receives an exception while processing the IO
106 operation: in these cases we also want to relinquish the lock.
108 There are three versions of @withHandle@: corresponding to the three
109 possible combinations of:
111 - the operation may side-effect the handle
112 - the operation may return a result
114 If the operation generates an error or an exception is raised, the
115 original handle is always replaced.
118 {-# INLINE withHandle #-}
119 withHandle :: String -> Handle -> (Handle__ -> IO (Handle__,a)) -> IO a
120 withHandle fun h@(FileHandle _ m) act = withHandle' fun h m act
121 withHandle fun h@(DuplexHandle _ m _) act = withHandle' fun h m act
123 withHandle' :: String -> Handle -> MVar Handle__
124 -> (Handle__ -> IO (Handle__,a)) -> IO a
125 withHandle' fun h m act =
127 (h',v) <- do_operation fun h act m
128 checkHandleInvariants h'
132 {-# INLINE withHandle_ #-}
133 withHandle_ :: String -> Handle -> (Handle__ -> IO a) -> IO a
134 withHandle_ fun h@(FileHandle _ m) act = withHandle_' fun h m act
135 withHandle_ fun h@(DuplexHandle _ m _) act = withHandle_' fun h m act
137 withHandle_' :: String -> Handle -> MVar Handle__ -> (Handle__ -> IO a) -> IO a
138 withHandle_' fun h m act = withHandle' fun h m $ \h_ -> do
142 withAllHandles__ :: String -> Handle -> (Handle__ -> IO Handle__) -> IO ()
143 withAllHandles__ fun h@(FileHandle _ m) act = withHandle__' fun h m act
144 withAllHandles__ fun h@(DuplexHandle _ r w) act = do
145 withHandle__' fun h r act
146 withHandle__' fun h w act
148 withHandle__' :: String -> Handle -> MVar Handle__ -> (Handle__ -> IO Handle__)
150 withHandle__' fun h m act =
152 h' <- do_operation fun h act m
153 checkHandleInvariants h'
157 do_operation :: String -> Handle -> (Handle__ -> IO a) -> MVar Handle__ -> IO a
158 do_operation fun h act m = do
160 checkHandleInvariants h_
161 act h_ `catchException` handler h_
166 _ | Just ioe <- fromException e ->
167 ioError (augmentIOError ioe fun h)
168 _ | Just async_ex <- fromException e -> do -- see Note [async]
169 let _ = async_ex :: AsyncException
172 do_operation fun h act m
178 -- If an asynchronous exception is raised during an I/O operation,
179 -- normally it is fine to just re-throw the exception synchronously.
180 -- However, if we are inside an unsafePerformIO or an
181 -- unsafeInterleaveIO, this would replace the enclosing thunk with the
182 -- exception raised, which is wrong (#3997). We have to release the
183 -- lock on the Handle, but what do we replace the thunk with? What
184 -- should happen when the thunk is subsequently demanded again?
186 -- The only sensible choice we have is to re-do the IO operation on
187 -- resumption, but then we have to be careful in the IO library that
188 -- this is always safe to do. In particular we should
190 -- never perform any side-effects before an interruptible operation
192 -- because the interruptible operation may raise an asynchronous
193 -- exception, which may cause the operation and its side effects to be
194 -- subsequently performed again.
196 -- Re-doing the IO operation is achieved by:
197 -- - using throwTo to re-throw the asynchronous exception asynchronously
198 -- in the current thread
199 -- - on resumption, it will be as if throwTo returns. In that case, we
200 -- recursively invoke the original operation (see do_operation above).
202 -- Interruptible operations in the I/O library are:
203 -- - threadWaitRead/threadWaitWrite
204 -- - fillReadBuffer/flushWriteBuffer
205 -- - readTextDevice/writeTextDevice
207 augmentIOError :: IOException -> String -> Handle -> IOException
208 augmentIOError ioe@IOError{ ioe_filename = fp } fun h
209 = ioe { ioe_handle = Just h, ioe_location = fun, ioe_filename = filepath }
212 | otherwise = case h of
213 FileHandle path _ -> Just path
214 DuplexHandle path _ _ -> Just path
216 -- ---------------------------------------------------------------------------
217 -- Wrapper for write operations.
219 wantWritableHandle :: String -> Handle -> (Handle__ -> IO a) -> IO a
220 wantWritableHandle fun h@(FileHandle _ m) act
221 = wantWritableHandle' fun h m act
222 wantWritableHandle fun h@(DuplexHandle _ _ m) act
223 = withHandle_' fun h m act
226 :: String -> Handle -> MVar Handle__
227 -> (Handle__ -> IO a) -> IO a
228 wantWritableHandle' fun h m act
229 = withHandle_' fun h m (checkWritableHandle act)
231 checkWritableHandle :: (Handle__ -> IO a) -> Handle__ -> IO a
232 checkWritableHandle act h_@Handle__{..}
234 ClosedHandle -> ioe_closedHandle
235 SemiClosedHandle -> ioe_closedHandle
236 ReadHandle -> ioe_notWritable
237 ReadWriteHandle -> do
238 buf <- readIORef haCharBuffer
239 when (not (isWriteBuffer buf)) $ do
240 flushCharReadBuffer h_
241 flushByteReadBuffer h_
242 buf <- readIORef haCharBuffer
243 writeIORef haCharBuffer buf{ bufState = WriteBuffer }
244 buf <- readIORef haByteBuffer
245 buf' <- Buffered.emptyWriteBuffer haDevice buf
246 writeIORef haByteBuffer buf'
250 -- ---------------------------------------------------------------------------
251 -- Wrapper for read operations.
253 wantReadableHandle :: String -> Handle -> (Handle__ -> IO (Handle__,a)) -> IO a
254 wantReadableHandle fun h act = withHandle fun h (checkReadableHandle act)
256 wantReadableHandle_ :: String -> Handle -> (Handle__ -> IO a) -> IO a
257 wantReadableHandle_ fun h@(FileHandle _ m) act
258 = wantReadableHandle' fun h m act
259 wantReadableHandle_ fun h@(DuplexHandle _ m _) act
260 = withHandle_' fun h m act
263 :: String -> Handle -> MVar Handle__
264 -> (Handle__ -> IO a) -> IO a
265 wantReadableHandle' fun h m act
266 = withHandle_' fun h m (checkReadableHandle act)
268 checkReadableHandle :: (Handle__ -> IO a) -> Handle__ -> IO a
269 checkReadableHandle act h_@Handle__{..} =
271 ClosedHandle -> ioe_closedHandle
272 SemiClosedHandle -> ioe_closedHandle
273 AppendHandle -> ioe_notReadable
274 WriteHandle -> ioe_notReadable
275 ReadWriteHandle -> do
276 -- a read/write handle and we want to read from it. We must
277 -- flush all buffered write data first.
278 bbuf <- readIORef haByteBuffer
279 when (isWriteBuffer bbuf) $ do
280 when (not (isEmptyBuffer bbuf)) $ flushByteWriteBuffer h_
281 cbuf' <- readIORef haCharBuffer
282 writeIORef haCharBuffer cbuf'{ bufState = ReadBuffer }
283 bbuf <- readIORef haByteBuffer
284 writeIORef haByteBuffer bbuf{ bufState = ReadBuffer }
288 -- ---------------------------------------------------------------------------
289 -- Wrapper for seek operations.
291 wantSeekableHandle :: String -> Handle -> (Handle__ -> IO a) -> IO a
292 wantSeekableHandle fun h@(DuplexHandle _ _ _) _act =
293 ioException (IOError (Just h) IllegalOperation fun
294 "handle is not seekable" Nothing Nothing)
295 wantSeekableHandle fun h@(FileHandle _ m) act =
296 withHandle_' fun h m (checkSeekableHandle act)
298 checkSeekableHandle :: (Handle__ -> IO a) -> Handle__ -> IO a
299 checkSeekableHandle act handle_@Handle__{haDevice=dev} =
300 case haType handle_ of
301 ClosedHandle -> ioe_closedHandle
302 SemiClosedHandle -> ioe_closedHandle
303 AppendHandle -> ioe_notSeekable
304 _ -> do b <- IODevice.isSeekable dev
305 if b then act handle_
308 -- -----------------------------------------------------------------------------
311 ioe_closedHandle, ioe_EOF,
312 ioe_notReadable, ioe_notWritable, ioe_cannotFlushNotSeekable,
313 ioe_notSeekable, ioe_invalidCharacter :: IO a
315 ioe_closedHandle = ioException
316 (IOError Nothing IllegalOperation ""
317 "handle is closed" Nothing Nothing)
318 ioe_EOF = ioException
319 (IOError Nothing EOF "" "" Nothing Nothing)
320 ioe_notReadable = ioException
321 (IOError Nothing IllegalOperation ""
322 "handle is not open for reading" Nothing Nothing)
323 ioe_notWritable = ioException
324 (IOError Nothing IllegalOperation ""
325 "handle is not open for writing" Nothing Nothing)
326 ioe_notSeekable = ioException
327 (IOError Nothing IllegalOperation ""
328 "handle is not seekable" Nothing Nothing)
329 ioe_cannotFlushNotSeekable = ioException
330 (IOError Nothing IllegalOperation ""
331 "cannot flush the read buffer: underlying device is not seekable"
333 ioe_invalidCharacter = ioException
334 (IOError Nothing InvalidArgument ""
335 ("invalid byte sequence for this encoding") Nothing Nothing)
337 ioe_finalizedHandle :: FilePath -> Handle__
338 ioe_finalizedHandle fp = throw
339 (IOError Nothing IllegalOperation ""
340 "handle is finalized" Nothing (Just fp))
342 ioe_bufsiz :: Int -> IO a
343 ioe_bufsiz n = ioException
344 (IOError Nothing InvalidArgument "hSetBuffering"
345 ("illegal buffer size " ++ showsPrec 9 n []) Nothing Nothing)
346 -- 9 => should be parens'ified.
348 -- -----------------------------------------------------------------------------
351 -- For a duplex handle, we arrange that the read side points to the write side
352 -- (and hence keeps it alive if the read side is alive). This is done by
353 -- having the haOtherSide field of the read side point to the read side.
354 -- The finalizer is then placed on the write side, and the handle only gets
355 -- finalized once, when both sides are no longer required.
357 -- NOTE about finalized handles: It's possible that a handle can be
358 -- finalized and then we try to use it later, for example if the
359 -- handle is referenced from another finalizer, or from a thread that
360 -- has become unreferenced and then resurrected (arguably in the
361 -- latter case we shouldn't finalize the Handle...). Anyway,
362 -- we try to emit a helpful message which is better than nothing.
364 -- [later; 8/2010] However, a program like this can yield a strange
367 -- main = writeFile "out" loop
368 -- loop = let x = x in x
370 -- because the main thread and the Handle are both unreachable at the
371 -- same time, the Handle may get finalized before the main thread
372 -- receives the NonTermination exception, and the exception handler
373 -- will then report an error. We'd rather this was not an error and
374 -- the program just prints "<<loop>>".
376 handleFinalizer :: FilePath -> MVar Handle__ -> IO ()
377 handleFinalizer fp m = do
378 handle_ <- takeMVar m
379 (handle_', _) <- hClose_help handle_
383 -- ---------------------------------------------------------------------------
384 -- Allocating buffers
386 -- using an 8k char buffer instead of 32k improved performance for a
387 -- basic "cat" program by ~30% for me. --SDM
388 dEFAULT_CHAR_BUFFER_SIZE :: Int
389 dEFAULT_CHAR_BUFFER_SIZE = dEFAULT_BUFFER_SIZE `div` 4
391 getCharBuffer :: IODevice dev => dev -> BufferState
392 -> IO (IORef CharBuffer, BufferMode)
393 getCharBuffer dev state = do
394 buffer <- newCharBuffer dEFAULT_CHAR_BUFFER_SIZE state
395 ioref <- newIORef buffer
396 is_tty <- IODevice.isTerminal dev
399 | is_tty = LineBuffering
400 | otherwise = BlockBuffering Nothing
402 return (ioref, buffer_mode)
404 mkUnBuffer :: BufferState -> IO (IORef CharBuffer, BufferMode)
405 mkUnBuffer state = do
406 buffer <- newCharBuffer dEFAULT_CHAR_BUFFER_SIZE state
407 -- See [note Buffer Sizing], GHC.IO.Handle.Types
408 ref <- newIORef buffer
409 return (ref, NoBuffering)
411 -- -----------------------------------------------------------------------------
414 -- | syncs the file with the buffer, including moving the
415 -- file pointer backwards in the case of a read buffer. This can fail
416 -- on a non-seekable read Handle.
417 flushBuffer :: Handle__ -> IO ()
418 flushBuffer h_@Handle__{..} = do
419 buf <- readIORef haCharBuffer
422 flushCharReadBuffer h_
423 flushByteReadBuffer h_
425 flushByteWriteBuffer h_
427 -- | flushes the Char buffer only. Works on all Handles.
428 flushCharBuffer :: Handle__ -> IO ()
429 flushCharBuffer h_@Handle__{..} = do
430 cbuf <- readIORef haCharBuffer
431 case bufState cbuf of
433 flushCharReadBuffer h_
435 when (not (isEmptyBuffer cbuf)) $
436 error "internal IO library error: Char buffer non-empty"
438 -- -----------------------------------------------------------------------------
439 -- Writing data (flushing write buffers)
441 -- flushWriteBuffer flushes the buffer iff it contains pending write
442 -- data. Flushes both the Char and the byte buffer, leaving both
444 flushWriteBuffer :: Handle__ -> IO ()
445 flushWriteBuffer h_@Handle__{..} = do
446 buf <- readIORef haByteBuffer
447 when (isWriteBuffer buf) $ flushByteWriteBuffer h_
449 flushByteWriteBuffer :: Handle__ -> IO ()
450 flushByteWriteBuffer h_@Handle__{..} = do
451 bbuf <- readIORef haByteBuffer
452 when (not (isEmptyBuffer bbuf)) $ do
453 bbuf' <- Buffered.flushWriteBuffer haDevice bbuf
454 writeIORef haByteBuffer bbuf'
456 -- write the contents of the CharBuffer to the Handle__.
457 -- The data will be encoded and pushed to the byte buffer,
458 -- flushing if the buffer becomes full.
459 writeCharBuffer :: Handle__ -> CharBuffer -> IO ()
460 writeCharBuffer h_@Handle__{..} !cbuf = do
462 bbuf <- readIORef haByteBuffer
464 debugIO ("writeCharBuffer: cbuf=" ++ summaryBuffer cbuf ++
465 " bbuf=" ++ summaryBuffer bbuf)
467 (cbuf',bbuf') <- case haEncoder of
468 Nothing -> latin1_encode cbuf bbuf
469 Just encoder -> (encode encoder) cbuf bbuf
471 debugIO ("writeCharBuffer after encoding: cbuf=" ++ summaryBuffer cbuf' ++
472 " bbuf=" ++ summaryBuffer bbuf')
474 -- flush if the write buffer is full
475 if isFullBuffer bbuf'
476 -- or we made no progress
477 || not (isEmptyBuffer cbuf') && bufL cbuf' == bufL cbuf
478 -- or the byte buffer has more elements than the user wanted buffered
479 || (case haBufferMode of
480 BlockBuffering (Just s) -> bufferElems bbuf' >= s
484 bbuf'' <- Buffered.flushWriteBuffer haDevice bbuf'
485 writeIORef haByteBuffer bbuf''
487 writeIORef haByteBuffer bbuf'
489 if not (isEmptyBuffer cbuf')
490 then writeCharBuffer h_ cbuf'
493 -- -----------------------------------------------------------------------------
494 -- Flushing read buffers
496 -- It is always possible to flush the Char buffer back to the byte buffer.
497 flushCharReadBuffer :: Handle__ -> IO ()
498 flushCharReadBuffer Handle__{..} = do
499 cbuf <- readIORef haCharBuffer
500 if isWriteBuffer cbuf || isEmptyBuffer cbuf then return () else do
502 -- haLastDecode is the byte buffer just before we did our last batch of
503 -- decoding. We're going to re-decode the bytes up to the current char,
504 -- to find out where we should revert the byte buffer to.
505 (codec_state, bbuf0) <- readIORef haLastDecode
507 cbuf0 <- readIORef haCharBuffer
508 writeIORef haCharBuffer cbuf0{ bufL=0, bufR=0 }
510 -- if we haven't used any characters from the char buffer, then just
511 -- re-install the old byte buffer.
513 then do writeIORef haByteBuffer bbuf0
519 writeIORef haByteBuffer bbuf0 { bufL = bufL bbuf0 + bufL cbuf0 }
520 -- no decoder: the number of bytes to decode is the same as the
521 -- number of chars we have used up.
524 debugIO ("flushCharReadBuffer re-decode, bbuf=" ++ summaryBuffer bbuf0 ++
525 " cbuf=" ++ summaryBuffer cbuf0)
527 -- restore the codec state
528 setState decoder codec_state
530 (bbuf1,cbuf1) <- (encode decoder) bbuf0
531 cbuf0{ bufL=0, bufR=0, bufSize = bufL cbuf0 }
533 debugIO ("finished, bbuf=" ++ summaryBuffer bbuf1 ++
534 " cbuf=" ++ summaryBuffer cbuf1)
536 writeIORef haByteBuffer bbuf1
539 -- When flushing the byte read buffer, we seek backwards by the number
540 -- of characters in the buffer. The file descriptor must therefore be
541 -- seekable: attempting to flush the read buffer on an unseekable
542 -- handle is not allowed.
544 flushByteReadBuffer :: Handle__ -> IO ()
545 flushByteReadBuffer h_@Handle__{..} = do
546 bbuf <- readIORef haByteBuffer
548 if isEmptyBuffer bbuf then return () else do
550 seekable <- IODevice.isSeekable haDevice
551 when (not seekable) $ ioe_cannotFlushNotSeekable
553 let seek = negate (bufR bbuf - bufL bbuf)
555 debugIO ("flushByteReadBuffer: new file offset = " ++ show seek)
556 IODevice.seek haDevice RelativeSeek (fromIntegral seek)
558 writeIORef haByteBuffer bbuf{ bufL=0, bufR=0 }
560 -- ----------------------------------------------------------------------------
563 mkHandle :: (IODevice dev, BufferedIO dev, Typeable dev) => dev
567 -> Maybe TextEncoding
569 -> Maybe HandleFinalizer
570 -> Maybe (MVar Handle__)
573 mkHandle dev filepath ha_type buffered mb_codec nl finalizer other_side = do
574 openTextEncoding mb_codec ha_type $ \ mb_encoder mb_decoder -> do
576 let buf_state = initBufferState ha_type
577 bbuf <- Buffered.newBuffer dev buf_state
578 bbufref <- newIORef bbuf
579 last_decode <- newIORef (error "codec_state", bbuf)
582 if buffered then getCharBuffer dev buf_state
583 else mkUnBuffer buf_state
585 spares <- newIORef BufferListNil
586 newFileHandle filepath finalizer
587 (Handle__ { haDevice = dev,
589 haBufferMode = bmode,
590 haByteBuffer = bbufref,
591 haLastDecode = last_decode,
592 haCharBuffer = cbufref,
594 haEncoder = mb_encoder,
595 haDecoder = mb_decoder,
597 haInputNL = inputNL nl,
598 haOutputNL = outputNL nl,
599 haOtherSide = other_side
602 -- | makes a new 'Handle'
603 mkFileHandle :: (IODevice dev, BufferedIO dev, Typeable dev)
604 => dev -- ^ the underlying IO device, which must support
605 -- 'IODevice', 'BufferedIO' and 'Typeable'
607 -- ^ a string describing the 'Handle', e.g. the file
608 -- path for a file. Used in error messages.
610 -- The mode in which the 'Handle' is to be used
611 -> Maybe TextEncoding
612 -- Create the 'Handle' with no text encoding?
614 -- Translate newlines?
616 mkFileHandle dev filepath iomode mb_codec tr_newlines = do
617 mkHandle dev filepath (ioModeToHandleType iomode) True{-buffered-} mb_codec
619 (Just handleFinalizer) Nothing{-other_side-}
621 -- | like 'mkFileHandle', except that a 'Handle' is created with two
622 -- independent buffers, one for reading and one for writing. Used for
623 -- full-duplex streams, such as network sockets.
624 mkDuplexHandle :: (IODevice dev, BufferedIO dev, Typeable dev) => dev
625 -> FilePath -> Maybe TextEncoding -> NewlineMode -> IO Handle
626 mkDuplexHandle dev filepath mb_codec tr_newlines = do
628 write_side@(FileHandle _ write_m) <-
629 mkHandle dev filepath WriteHandle True mb_codec
631 (Just handleFinalizer)
632 Nothing -- no othersie
634 read_side@(FileHandle _ read_m) <-
635 mkHandle dev filepath ReadHandle True mb_codec
637 Nothing -- no finalizer
640 return (DuplexHandle filepath read_m write_m)
642 ioModeToHandleType :: IOMode -> HandleType
643 ioModeToHandleType ReadMode = ReadHandle
644 ioModeToHandleType WriteMode = WriteHandle
645 ioModeToHandleType ReadWriteMode = ReadWriteHandle
646 ioModeToHandleType AppendMode = AppendHandle
648 initBufferState :: HandleType -> BufferState
649 initBufferState ReadHandle = ReadBuffer
650 initBufferState _ = WriteBuffer
653 :: Maybe TextEncoding
655 -> (forall es ds . Maybe (TextEncoder es) -> Maybe (TextDecoder ds) -> IO a)
658 openTextEncoding Nothing ha_type cont = cont Nothing Nothing
659 openTextEncoding (Just TextEncoding{..}) ha_type cont = do
660 mb_decoder <- if isReadableHandleType ha_type then do
661 decoder <- mkTextDecoder
662 return (Just decoder)
665 mb_encoder <- if isWritableHandleType ha_type then do
666 encoder <- mkTextEncoder
667 return (Just encoder)
670 cont mb_encoder mb_decoder
672 closeTextCodecs :: Handle__ -> IO ()
673 closeTextCodecs Handle__{..} = do
674 case haDecoder of Nothing -> return (); Just d -> Encoding.close d
675 case haEncoder of Nothing -> return (); Just d -> Encoding.close d
677 -- ---------------------------------------------------------------------------
680 -- hClose_help is also called by lazyRead (in GHC.IO.Handle.Text) when
681 -- EOF is read or an IO error occurs on a lazy stream. The
682 -- semi-closed Handle is then closed immediately. We have to be
683 -- careful with DuplexHandles though: we have to leave the closing to
684 -- the finalizer in that case, because the write side may still be in
686 hClose_help :: Handle__ -> IO (Handle__, Maybe SomeException)
687 hClose_help handle_ =
688 case haType handle_ of
689 ClosedHandle -> return (handle_,Nothing)
690 _ -> do mb_exc1 <- trymaybe $ flushWriteBuffer handle_ -- interruptible
691 -- it is important that hClose doesn't fail and
692 -- leave the Handle open (#3128), so we catch
693 -- exceptions when flushing the buffer.
694 (h_, mb_exc2) <- hClose_handle_ handle_
695 return (h_, if isJust mb_exc1 then mb_exc1 else mb_exc2)
698 trymaybe :: IO () -> IO (Maybe SomeException)
699 trymaybe io = (do io; return Nothing) `catchException` \e -> return (Just e)
701 hClose_handle_ :: Handle__ -> IO (Handle__, Maybe SomeException)
702 hClose_handle_ h_@Handle__{..} = do
704 -- close the file descriptor, but not when this is the read
705 -- side of a duplex handle.
706 -- If an exception is raised by the close(), we want to continue
707 -- to close the handle and release the lock if it has one, then
708 -- we return the exception to the caller of hClose_help which can
709 -- raise it if necessary.
712 Nothing -> trymaybe $ IODevice.close haDevice
713 Just _ -> return Nothing
715 -- free the spare buffers
716 writeIORef haBuffers BufferListNil
717 writeIORef haCharBuffer noCharBuffer
718 writeIORef haByteBuffer noByteBuffer
720 -- release our encoder/decoder
723 -- we must set the fd to -1, because the finalizer is going
724 -- to run eventually and try to close/unlock it.
725 -- ToDo: necessary? the handle will be marked ClosedHandle
726 -- XXX GHC won't let us use record update here, hence wildcards
727 return (Handle__{ haType = ClosedHandle, .. }, maybe_exception)
729 {-# NOINLINE noCharBuffer #-}
730 noCharBuffer :: CharBuffer
731 noCharBuffer = unsafePerformIO $ newCharBuffer 1 ReadBuffer
733 {-# NOINLINE noByteBuffer #-}
734 noByteBuffer :: Buffer Word8
735 noByteBuffer = unsafePerformIO $ newByteBuffer 1 ReadBuffer
737 -- ---------------------------------------------------------------------------
740 hLookAhead_ :: Handle__ -> IO Char
741 hLookAhead_ handle_@Handle__{..} = do
742 buf <- readIORef haCharBuffer
744 -- fill up the read buffer if necessary
745 new_buf <- if isEmptyBuffer buf
746 then readTextDevice handle_ buf
748 writeIORef haCharBuffer new_buf
750 peekCharBuf (bufRaw buf) (bufL buf)
752 -- ---------------------------------------------------------------------------
755 debugIO :: String -> IO ()
758 = do _ <- withCStringLen (s ++ "\n") $
759 \(p, len) -> c_write 1 (castPtr p) (fromIntegral len)
761 | otherwise = return ()
763 -- ----------------------------------------------------------------------------
766 -- Read characters into the provided buffer. Return when any
767 -- characters are available; raise an exception if the end of
769 readTextDevice :: Handle__ -> CharBuffer -> IO CharBuffer
770 readTextDevice h_@Handle__{..} cbuf = do
772 bbuf0 <- readIORef haByteBuffer
774 debugIO ("readTextDevice: cbuf=" ++ summaryBuffer cbuf ++
775 " bbuf=" ++ summaryBuffer bbuf0)
777 bbuf1 <- if not (isEmptyBuffer bbuf0)
780 (r,bbuf1) <- Buffered.fillReadBuffer haDevice bbuf0
781 if r == 0 then ioe_EOF else do -- raise EOF
784 debugIO ("readTextDevice after reading: bbuf=" ++ summaryBuffer bbuf1)
789 writeIORef haLastDecode (error "codec_state", bbuf1)
790 latin1_decode bbuf1 cbuf
792 state <- getState decoder
793 writeIORef haLastDecode (state, bbuf1)
794 (encode decoder) bbuf1 cbuf
796 debugIO ("readTextDevice after decoding: cbuf=" ++ summaryBuffer cbuf' ++
797 " bbuf=" ++ summaryBuffer bbuf2)
799 writeIORef haByteBuffer bbuf2
800 if bufR cbuf' == bufR cbuf -- no new characters
801 then readTextDevice' h_ bbuf2 cbuf -- we need more bytes to make a Char
804 -- we have an incomplete byte sequence at the end of the buffer: try to
806 readTextDevice' :: Handle__ -> Buffer Word8 -> CharBuffer -> IO CharBuffer
807 readTextDevice' h_@Handle__{..} bbuf0 cbuf = do
809 -- copy the partial sequence to the beginning of the buffer, so we have
810 -- room to read more bytes.
811 bbuf1 <- slideContents bbuf0
813 bbuf2 <- do (r,bbuf2) <- Buffered.fillReadBuffer haDevice bbuf1
815 then ioe_invalidCharacter
818 debugIO ("readTextDevice after reading: bbuf=" ++ summaryBuffer bbuf2)
823 writeIORef haLastDecode (error "codec_state", bbuf2)
824 latin1_decode bbuf2 cbuf
826 state <- getState decoder
827 writeIORef haLastDecode (state, bbuf2)
828 (encode decoder) bbuf2 cbuf
830 debugIO ("readTextDevice after decoding: cbuf=" ++ summaryBuffer cbuf' ++
831 " bbuf=" ++ summaryBuffer bbuf3)
833 writeIORef haByteBuffer bbuf3
834 if bufR cbuf == bufR cbuf'
835 then readTextDevice' h_ bbuf3 cbuf'
838 -- Read characters into the provided buffer. Do not block;
839 -- return zero characters instead. Raises an exception on end-of-file.
840 readTextDeviceNonBlocking :: Handle__ -> CharBuffer -> IO CharBuffer
841 readTextDeviceNonBlocking h_@Handle__{..} cbuf = do
843 bbuf0 <- readIORef haByteBuffer
844 when (isEmptyBuffer bbuf0) $ do
845 (r,bbuf1) <- Buffered.fillReadBuffer0 haDevice bbuf0
846 if isNothing r then ioe_EOF else do -- raise EOF
847 writeIORef haByteBuffer bbuf1
849 decodeByteBuf h_ cbuf
851 -- Decode bytes from the byte buffer into the supplied CharBuffer.
852 decodeByteBuf :: Handle__ -> CharBuffer -> IO CharBuffer
853 decodeByteBuf h_@Handle__{..} cbuf = do
855 bbuf0 <- readIORef haByteBuffer
860 writeIORef haLastDecode (error "codec_state", bbuf0)
861 latin1_decode bbuf0 cbuf
863 state <- getState decoder
864 writeIORef haLastDecode (state, bbuf0)
865 (encode decoder) bbuf0 cbuf
867 writeIORef haByteBuffer bbuf2