diff options
author | Ben Gamari <ben@smart-cactus.org> | 2022-11-15 17:47:01 -0500 |
---|---|---|
committer | Marge Bot <ben+marge-bot@smart-cactus.org> | 2022-12-16 16:12:45 -0500 |
commit | a3eccf06292dd666b24606251a52da2b466a9612 (patch) | |
tree | e41efeb7366e87a694999dadcf5aa2b4d934e39d | |
parent | ad0e260af691ad47d73b22e698f6a4c08a6e9434 (diff) | |
download | haskell-a3eccf06292dd666b24606251a52da2b466a9612.tar.gz |
rts: Statically allocate capabilities
This is a rather simplistic way of solving #17289.
-rw-r--r-- | rts/Capability.c | 28 | ||||
-rw-r--r-- | rts/Capability.h | 4 | ||||
-rw-r--r-- | rts/include/rts/Config.h | 6 |
3 files changed, 19 insertions, 19 deletions
diff --git a/rts/Capability.c b/rts/Capability.c index 7ca20a6fc3..98c80887e5 100644 --- a/rts/Capability.c +++ b/rts/Capability.c @@ -45,7 +45,7 @@ uint32_t enabled_capabilities = 0; // Capabilities, because there may be pointers to them in use // (e.g. threads in waitForCapability(), see #8209), so this is // an array of Capability* rather than an array of Capability. -Capability **capabilities = NULL; +Capability *capabilities[MAX_N_CAPABILITIES]; // Holds the Capability which last became free. This is used so that // an in-call has a chance of quickly finding a free Capability. @@ -387,6 +387,12 @@ void initCapabilities (void) } #endif + if (RtsFlags.ParFlags.nCapabilities > MAX_N_CAPABILITIES) { + errorBelch("warning: this GHC runtime system only supports up to %d capabilities", + MAX_N_CAPABILITIES); + RtsFlags.ParFlags.nCapabilities = MAX_N_CAPABILITIES; + } + n_capabilities = 0; moreCapabilities(0, RtsFlags.ParFlags.nCapabilities); n_capabilities = RtsFlags.ParFlags.nCapabilities; @@ -394,7 +400,6 @@ void initCapabilities (void) #else /* !THREADED_RTS */ n_capabilities = 1; - capabilities = stgMallocBytes(sizeof(Capability*), "initCapabilities"); capabilities[0] = &MainCapability; initCapability(&MainCapability, 0); @@ -415,8 +420,6 @@ void moreCapabilities (uint32_t from USED_IF_THREADS, uint32_t to USED_IF_THREADS) { #if defined(THREADED_RTS) - Capability **new_capabilities = stgMallocBytes(to * sizeof(Capability*), "moreCapabilities"); - // We must disable the timer while we do this since the tick handler may // call contextSwitchAllCapabilities, which may see the capabilities array // as we free it. The alternative would be to protect the capabilities @@ -428,30 +431,22 @@ moreCapabilities (uint32_t from USED_IF_THREADS, uint32_t to USED_IF_THREADS) // THREADED_RTS must work on builds that don't have a mutable // BaseReg (eg. unregisterised), so in this case // capabilities[0] must coincide with &MainCapability. - new_capabilities[0] = &MainCapability; + capabilities[0] = &MainCapability; initCapability(&MainCapability, 0); } else { for (uint32_t i = 0; i < to; i++) { - if (i < from) { - new_capabilities[i] = capabilities[i]; - } else { - new_capabilities[i] = stgMallocBytes(sizeof(Capability), + if (i >= from) { + capabilities[i] = stgMallocBytes(sizeof(Capability), "moreCapabilities"); - initCapability(new_capabilities[i], i); + initCapability(capabilities[i], i); } } } debugTrace(DEBUG_sched, "allocated %d more capabilities", to - from); - Capability **old_capabilities = ACQUIRE_LOAD(&capabilities); - RELEASE_STORE(&capabilities, new_capabilities); - if (old_capabilities != NULL) { - stgFree(old_capabilities); - } - startTimer(); #endif } @@ -1285,7 +1280,6 @@ freeCapabilities (void) #else freeCapability(&MainCapability); #endif - stgFree(capabilities); traceCapsetDelete(CAPSET_OSPROCESS_DEFAULT); traceCapsetDelete(CAPSET_CLOCKDOMAIN_DEFAULT); } diff --git a/rts/Capability.h b/rts/Capability.h index 2681962be6..2910c3faf0 100644 --- a/rts/Capability.h +++ b/rts/Capability.h @@ -261,11 +261,11 @@ INLINE_HEADER void releaseCapability_ (Capability* cap STG_UNUSED, // extern uint32_t enabled_capabilities; // Array of all the capabilities -extern Capability **capabilities; +extern Capability *capabilities[MAX_N_CAPABILITIES]; INLINE_HEADER Capability *getCapability(uint32_t i) { - return RELAXED_LOAD(&capabilities)[i]; + return RELAXED_LOAD(&capabilities[i]); } // diff --git a/rts/include/rts/Config.h b/rts/include/rts/Config.h index 0f923205f5..abce93acb4 100644 --- a/rts/include/rts/Config.h +++ b/rts/include/rts/Config.h @@ -76,3 +76,9 @@ code. #if defined(DEBUG) #define PROF_SPIN #endif + +#if defined(THREADED_RTS) +#define MAX_N_CAPABILITIES 256 +#else +#define MAX_N_CAPABILITIES 1 +#endif |