summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBen Gamari <ben@smart-cactus.org>2022-11-15 17:47:01 -0500
committerMarge Bot <ben+marge-bot@smart-cactus.org>2022-12-16 16:12:45 -0500
commita3eccf06292dd666b24606251a52da2b466a9612 (patch)
treee41efeb7366e87a694999dadcf5aa2b4d934e39d
parentad0e260af691ad47d73b22e698f6a4c08a6e9434 (diff)
downloadhaskell-a3eccf06292dd666b24606251a52da2b466a9612.tar.gz
rts: Statically allocate capabilities
This is a rather simplistic way of solving #17289.
-rw-r--r--rts/Capability.c28
-rw-r--r--rts/Capability.h4
-rw-r--r--rts/include/rts/Config.h6
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