Use message-passing to implement throwTo in the RTS
authorSimon Marlow <marlowsd@gmail.com>
Thu, 11 Mar 2010 09:57:44 +0000 (09:57 +0000)
committerSimon Marlow <marlowsd@gmail.com>
Thu, 11 Mar 2010 09:57:44 +0000 (09:57 +0000)
commit7408b39235bccdcde48df2a73337ff976fbc09b7
treecf20c372fdc5787170d53df36fc24ecf8113c89e
parent12cfec943127f0c81e1ffa1ca5ce46e888e3027c
Use message-passing to implement throwTo in the RTS

This replaces some complicated locking schemes with message-passing
in the implementation of throwTo. The benefits are

 - previously it was impossible to guarantee that a throwTo from
   a thread running on one CPU to a thread running on another CPU
   would be noticed, and we had to rely on the GC to pick up these
   forgotten exceptions. This no longer happens.

 - the locking regime is simpler (though the code is about the same
   size)

 - threads can be unblocked from a blocked_exceptions queue without
   having to traverse the whole queue now.  It's a rare case, but
   replaces an O(n) operation with an O(1).

 - generally we move in the direction of sharing less between
   Capabilities (aka HECs), which will become important with other
   changes we have planned.

Also in this patch I replaced several STM-specific closure types with
a generic MUT_PRIM closure type, which allowed a lot of code in the GC
and other places to go away, hence the line-count reduction.  The
message-passing changes resulted in about a net zero line-count
difference.
35 files changed:
includes/rts/Constants.h
includes/rts/storage/ClosureMacros.h
includes/rts/storage/ClosureTypes.h
includes/rts/storage/Closures.h
includes/rts/storage/SMPClosureOps.h
includes/rts/storage/TSO.h
includes/stg/MiscClosures.h
rts/Capability.c
rts/Capability.h
rts/ClosureFlags.c
rts/Exception.cmm
rts/FrontPanel.c
rts/HeapStackCheck.cmm
rts/LdvProfile.c
rts/PrimOps.cmm
rts/Printer.c
rts/ProfHeap.c
rts/RaiseAsync.c
rts/RaiseAsync.h
rts/RetainerProfile.c
rts/RtsMessages.c
rts/STM.c
rts/Schedule.c
rts/Schedule.h
rts/StgMiscClosures.cmm
rts/Threads.c
rts/Threads.h
rts/Trace.h
rts/eventlog/EventLog.h
rts/sm/Compact.c
rts/sm/Evac.c
rts/sm/GC.c
rts/sm/MarkWeak.c
rts/sm/Sanity.c
rts/sm/Scav.c