diff options
author | Simon Marlow <marlowsd@gmail.com> | 2013-09-04 10:37:10 +0100 |
---|---|---|
committer | Simon Marlow <marlowsd@gmail.com> | 2013-09-04 11:00:32 +0100 |
commit | aa779e092c4f4d6a6691f3a4fc4074e6359337f8 (patch) | |
tree | f4c4e22da3aa71eff569b01af603836d7b5fd6a5 /rts/Capability.h | |
parent | 5a3918febb7354e0900c4f04151599d833716032 (diff) | |
download | haskell-aa779e092c4f4d6a6691f3a4fc4074e6359337f8.tar.gz |
Don't move Capabilities in setNumCapabilities (#8209)
We have various problems with reallocating the array of Capabilities,
due to threads in waitForReturnCapability that are already holding a
pointer to a Capability.
Rather than add more locking to make this safer, I decided it would be
easier to ensure that we never move the Capabilities at all. The
capabilities array is now an array of pointers to Capabaility. There
are extra indirections, but it rarely matters - we don't often access
Capabilities via the array, normally we already have a pointer to
one. I ran the parallel benchmarks and didn't see any difference.
Diffstat (limited to 'rts/Capability.h')
-rw-r--r-- | rts/Capability.h | 8 |
1 files changed, 4 insertions, 4 deletions
diff --git a/rts/Capability.h b/rts/Capability.h index 3348f88e4d..9de47357c4 100644 --- a/rts/Capability.h +++ b/rts/Capability.h @@ -132,8 +132,8 @@ struct Capability_ { StgTRecHeader *free_trec_headers; nat transaction_tokens; } // typedef Capability is defined in RtsAPI.h - // Capabilities are stored in an array, so make sure that adjacent - // Capabilities don't share any cache-lines: + // We never want a Capability to overlap a cache line with anything + // else, so round it up to a cache line size: #ifndef mingw32_HOST_OS ATTRIBUTE_ALIGNED(64) #endif @@ -181,7 +181,7 @@ void initCapabilities (void); // Add and initialise more Capabilities // -Capability * moreCapabilities (nat from, nat to); +void moreCapabilities (nat from, nat to); // Release a capability. This is called by a Task that is exiting // Haskell to make a foreign call, or in various other cases when we @@ -211,7 +211,7 @@ INLINE_HEADER void releaseCapability_ (Capability* cap STG_UNUSED, // Array of all the capabilities // -extern Capability *capabilities; +extern Capability **capabilities; // The Capability that was last free. Used as a good guess for where // to assign new threads. |