New implementation of BLACKHOLEs
authorSimon Marlow <marlowsd@gmail.com>
Mon, 29 Mar 2010 14:44:56 +0000 (14:44 +0000)
committerSimon Marlow <marlowsd@gmail.com>
Mon, 29 Mar 2010 14:44:56 +0000 (14:44 +0000)
commit5d52d9b64c21dcf77849866584744722f8121389
tree25aeafc9b761e73714c24ae414c0b1c41765c99f
parent79957d77c1bff767f1041d3fabdeb94d92a52878
New implementation of BLACKHOLEs

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.
47 files changed:
compiler/cmm/CLabel.hs
compiler/codeGen/CgCallConv.hs
compiler/codeGen/CgClosure.lhs
compiler/codeGen/CgMonad.lhs
compiler/codeGen/CgStackery.lhs
includes/Rts.h
includes/mkDerivedConstants.c
includes/rts/storage/ClosureMacros.h
includes/rts/storage/ClosureTypes.h
includes/rts/storage/Closures.h
includes/rts/storage/TSO.h
includes/stg/MiscClosures.h
rts/Capability.c
rts/Capability.h
rts/ClosureFlags.c
rts/FrontPanel.c
rts/HeapStackCheck.cmm
rts/Interpreter.c
rts/LdvProfile.c
rts/Linker.c
rts/Messages.c [new file with mode: 0644]
rts/Messages.h [new file with mode: 0644]
rts/PrimOps.cmm
rts/Printer.c
rts/ProfHeap.c
rts/RaiseAsync.c
rts/RetainerProfile.c
rts/STM.c
rts/Schedule.c
rts/Schedule.h
rts/StgMiscClosures.cmm
rts/ThreadPaused.c
rts/Threads.c
rts/Threads.h
rts/Timer.c
rts/Updates.cmm
rts/Updates.h
rts/posix/OSMem.c
rts/sm/Compact.c
rts/sm/Evac.c
rts/sm/GC.c
rts/sm/MarkWeak.c
rts/sm/MarkWeak.h
rts/sm/Sanity.c
rts/sm/Scav.c
rts/sm/Storage.c
utils/genapply/GenApply.hs