• Simon Marlow's avatar
    New implementation of BLACKHOLEs · 5d52d9b6
    Simon Marlow authored
    This replaces the global blackhole_queue with a clever scheme that
    enables us to queue up blocked threads on the closure that they are
    blocked on, while still avoiding atomic instructions in the common
    case.
    
    Advantages:
    
     - gets rid of a locked global data structure and some tricky GC code
       (replacing it with some per-thread data structures and different
       tricky GC code :)
    
     - wakeups are more prompt: parallel/concurrent performance should
       benefit.  I haven't seen anything dramatic in the parallel
       benchmarks so far, but a couple of threading benchmarks do improve
       a bit.
    
     - waking up a thread blocked on a blackhole is now O(1) (e.g. if
       it is the target of throwTo).
    
     - less sharing and better separation of Capabilities: communication
       is done with messages, the data structures are strictly owned by a
       Capability and cannot be modified except by sending messages.
    
     - this change will utlimately enable us to do more intelligent
       scheduling when threads block on each other.  This is what started
       off the whole thing, but it isn't done yet (#3838).
    
    I'll be documenting all this on the wiki in due course.
    5d52d9b6
ClosureFlags.c 4.54 KB