hPutBufNonBlocking can block
This simply escalates an existing TODO in the code base to a ticket.
The function System.IO.hPutBufNonBlocking [1] calls hPutBuf' with can_block = False, which is commented as Bool -- allow blocking? (relevant lines)
However, hPutBuf' calls bufWrite, inside which there's the comment (relevant line):
if (...)
-- There's enough room in the buffer:
-- just copy the data in and update bufR.
then do ...
-- else, we have to flush
else do ...
old_buf' <- Buffered.flushWriteBuffer haDevice old_buf
-- TODO: we should do a non-blocking flush here
so it turns out that if there's not enough room in the Handle buffer, then hPutBufNonBlocking will block.
Trac metadata
| Trac field | Value |
|---|---|
| Version | 8.0.2 |
| Type | Bug |
| TypeOfFailure | OtherFailure |
| Priority | normal |
| Resolution | Unresolved |
| Component | Compiler |
| Test case | |
| Differential revisions | |
| BlockedBy | |
| Related | |
| Blocking | |
| CC | nh2, simonmar |
| Operating system | |
| Architecture |