[GHC] #13944: Introduce synchronized FFI

GHC ghc-devs at haskell.org
Tue Jul 11 01:42:04 UTC 2017


#13944: Introduce synchronized FFI
-------------------------------------+-------------------------------------
        Reporter:  winter            |                Owner:  (none)
            Type:  feature request   |               Status:  new
        Priority:  normal            |            Milestone:  8.4.1
       Component:  Compiler          |              Version:  8.0.1
      Resolution:                    |             Keywords:
Operating System:  Unknown/Multiple  |         Architecture:
                                     |  Unknown/Multiple
 Type of failure:  None/Unknown      |            Test Case:
      Blocked By:                    |             Blocking:
 Related Tickets:                    |  Differential Rev(s):
       Wiki Page:                    |
-------------------------------------+-------------------------------------

Comment (by winter):

 > Alright, I think I see what you want. So you are targetting applications
 where you have a potentially-blocking foreign call and therefore can't use
 `unsafe` calls but want to avoid the cost associated with suspending a
 Haskell thread.

 Exactly! For example current I/O manager first perform an unsafe read and
 check if result is eAgain, but for regular file it will never return
 eAgain, which turn this unsafe read into a blocking read. If unfortunately
 OS didn't manage page cache for us, we end up with a long capacity
 blocking read.

 > The problem is that, other than perhaps the stack walk, I don't think
 any of these costs can be avoided. Afterall, we need to save the thread
 state to the TSO in order to safely GC (since TSOs are GC roots). I
 suspect it would also be necessary to lock the capability.

 Is there a way to do it lazily? By say lazily i meaning, can we just
 perform the FFI call and mark the capacity with some kind of `SYNC` flag.
 If a GC thread is asking for sync during FFI, then let it perform these
 stack saving for us. Otherwise we just happily continue, and saving all
 the overheads.

 I think this might work since once we enter a FFI call, the haskell
 thread's stack are not touch anymore, and the whole capacity is freezed.

--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/13944#comment:7>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler


More information about the ghc-tickets mailing list