Split part of the Task struct into a separate struct InCall
authorSimon Marlow <marlowsd@gmail.com>
Tue, 9 Mar 2010 14:31:11 +0000 (14:31 +0000)
committerSimon Marlow <marlowsd@gmail.com>
Tue, 9 Mar 2010 14:31:11 +0000 (14:31 +0000)
commit7effbbbbdfe7eb05c6402fa9337e358e7e9fadde
treed5896a7858db38265b77fc799fc54d5151737aab
parent4e8b07dbc753a5132c574926468ba886728c9049
Split part of the Task struct into a separate struct InCall

The idea is that this leaves Tasks and OSThread in one-to-one
correspondence.  The part of a Task that represents a call into
Haskell from C is split into a separate struct InCall, pointed to by
the Task and the TSO bound to it.  A given OSThread/Task thus always
uses the same mutex and condition variable, rather than getting a new
one for each callback.  Conceptually it is simpler, although there are
more types and indirections in a few places now.

This improves callback performance by removing some of the locks that
we had to take when making in-calls.  Now we also keep the current Task
in a thread-local variable if supported by the OS and gcc (currently
only Linux).
includes/rts/storage/TSO.h
rts/Capability.c
rts/Capability.h
rts/Schedule.c
rts/Schedule.h
rts/Stats.c
rts/Task.c
rts/Task.h
rts/Threads.c
rts/sm/Compact.c