
So how does the spark turn into a thread? When the scheduler spots that
#14330: Sparks are not started promptly -------------------------------------+------------------------------------- Reporter: andrewthad | Owner: (none) Type: bug | Status: new Priority: normal | Milestone: Component: Compiler | Version: 8.2.1 Resolution: | Keywords: sparks 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): The current behavior is strange, from GHC Commentary/Rts/Scheduler: the current capability has no runnable threads, it checks the spark pool, and if there is a valid spark (a spark that points to a THUNK), then the spark is turned into a real thread and placed on the run queue: see createSparkThread in rts/Sparks.c. Also, the scheduler attempts to share its available sparks with any other idle capabilities: see schedulePushWork in rts/Schedule.c. Why do we have to wait until there is no runnable threads? A new spark should at least have a same priority with a new thread created with `forkIO`. The right way to do this IMHO is to ''always'' check the sparks pool within one scheduling loop, this can be done by start a sparks thread dedicated to check sparks just like I/O or timer manager. -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/14330#comment:3 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler