Ticket #44 (new defect)
Opened 16 months ago
Network.Socket.connect blocks the whole RTS on Windows with -threaded
| Reported by: | joeyadams | Owned by: | |
|---|---|---|---|
| Priority: | major | Milestone: | |
| Component: | network | Version: | 2.3 |
| Keywords: | FFI | Cc: |
Description
On Windows with -threaded, when Network.Socket.connect is called, it blocks the whole RTS until the connection attempt succeeds or fails.
This is because under the hood, it is calling c_connect, an unsafe foreign import:
foreign import CALLCONV unsafe "connect"
c_connect :: CInt -> Ptr SockAddr -> CInt{-CSockLen???-} -> IO CInt
Unsafe foreign calls block the whole runtime system. Safe foreign calls block only the current thread (but cannot be interrupted by exceptions).
I tested it on Windows with network-2.3.0.8, and Network.Socket.connect does in fact block the whole program. When I changed unsafe to safe and recompiled, it did not block the whole program.
It seems clear that c_connect should be a safe foreign import, at least on Windows with -threaded. Are there any other foreign calls marked safe that could potentially block on Windows?
