summaryrefslogtreecommitdiff
path: root/rts/Capability.c
diff options
context:
space:
mode:
authorBen Gamari <ben@smart-cactus.org>2022-11-09 12:39:47 -0500
committerMarge Bot <ben+marge-bot@smart-cactus.org>2022-12-16 16:12:44 -0500
commit70999283156f527c5aea6dee57a3d14989a9903a (patch)
tree50a7d056523d831e4df2202911b78ebb5c92a9af /rts/Capability.c
parent99269b9fd817262a686867383bf0fe88fdc64fb0 (diff)
downloadhaskell-70999283156f527c5aea6dee57a3d14989a9903a.tar.gz
rts: Introduce getNumCapabilities
And ensure accesses to n_capabilities are atomic (although with relaxed ordering). This is necessary as RTS API callers may concurrently call into the RTS without holding a capability.
Diffstat (limited to 'rts/Capability.c')
-rw-r--r--rts/Capability.c18
1 files changed, 9 insertions, 9 deletions
diff --git a/rts/Capability.c b/rts/Capability.c
index afe21fcb46..bf20d991e8 100644
--- a/rts/Capability.c
+++ b/rts/Capability.c
@@ -131,7 +131,7 @@ findSpark (Capability *cap)
retry = true;
}
- if (n_capabilities == 1) { return NULL; } // makes no sense...
+ if (getNumCapabilities() == 1) { return NULL; } // makes no sense...
debugTrace(DEBUG_sched,
"cap %d: Trying to steal work from other capabilities",
@@ -139,7 +139,7 @@ findSpark (Capability *cap)
/* visit cap.s 0..n-1 in sequence until a theft succeeds. We could
start at a random place instead of 0 as well. */
- for ( i=0 ; i < n_capabilities ; i++ ) {
+ for ( i=0 ; i < getNumCapabilities() ; i++ ) {
robbed = capabilities[i];
if (cap == robbed) // ourselves...
continue;
@@ -182,7 +182,7 @@ anySparks (void)
{
uint32_t i;
- for (i=0; i < n_capabilities; i++) {
+ for (i=0; i < getNumCapabilities(); i++) {
if (!emptySparkPoolCap(capabilities[i])) {
return true;
}
@@ -464,7 +464,7 @@ moreCapabilities (uint32_t from USED_IF_THREADS, uint32_t to USED_IF_THREADS)
void contextSwitchAllCapabilities(void)
{
uint32_t i;
- for (i=0; i < n_capabilities; i++) {
+ for (i=0; i < getNumCapabilities(); i++) {
contextSwitchCapability(capabilities[i], true);
}
}
@@ -472,7 +472,7 @@ void contextSwitchAllCapabilities(void)
void interruptAllCapabilities(void)
{
uint32_t i;
- for (i=0; i < n_capabilities; i++) {
+ for (i=0; i < getNumCapabilities(); i++) {
interruptCapability(capabilities[i]);
}
}
@@ -1249,7 +1249,7 @@ void
shutdownCapabilities(Task *task, bool safe)
{
uint32_t i;
- for (i=0; i < n_capabilities; i++) {
+ for (i=0; i < getNumCapabilities(); i++) {
ASSERT(task->incall->tso == NULL);
shutdownCapability(capabilities[i], task, safe);
}
@@ -1276,7 +1276,7 @@ freeCapabilities (void)
{
#if defined(THREADED_RTS)
uint32_t i;
- for (i=0; i < n_capabilities; i++) {
+ for (i=0; i < getNumCapabilities(); i++) {
freeCapability(capabilities[i]);
if (capabilities[i] != &MainCapability)
stgFree(capabilities[i]);
@@ -1332,7 +1332,7 @@ void
markCapabilities (evac_fn evac, void *user)
{
uint32_t n;
- for (n = 0; n < n_capabilities; n++) {
+ for (n = 0; n < getNumCapabilities(); n++) {
markCapability(evac, user, capabilities[n], false);
}
}
@@ -1344,7 +1344,7 @@ bool checkSparkCountInvariant (void)
StgWord64 remaining = 0;
uint32_t i;
- for (i = 0; i < n_capabilities; i++) {
+ for (i = 0; i < getNumCapabilities(); i++) {
sparks.created += capabilities[i]->spark_stats.created;
sparks.dud += capabilities[i]->spark_stats.dud;
sparks.overflowed+= capabilities[i]->spark_stats.overflowed;