From 39e3ac5dd100d6d440c82efa72bfda405eb4586f Mon Sep 17 00:00:00 2001 From: Ben Gamari <ben@smart-cactus.org> Date: Thu, 14 Dec 2023 12:27:18 -0500 Subject: [PATCH] rts: Use `switch` to branch on why_blocked This is a semantics-preserving refactoring. --- rts/TraverseHeap.c | 13 ++++++++----- rts/sm/Compact.c | 15 +++++++++------ rts/sm/NonMovingMark.c | 15 +++++++++------ rts/sm/Scav.c | 19 ++++++++++--------- 4 files changed, 36 insertions(+), 26 deletions(-) diff --git a/rts/TraverseHeap.c b/rts/TraverseHeap.c index 1757218ab788..e3d3c8390cae 100644 --- a/rts/TraverseHeap.c +++ b/rts/TraverseHeap.c @@ -1239,12 +1239,15 @@ inner_loop: traversePushClosure(ts, (StgClosure *) tso->blocked_exceptions, c, sep, child_data); traversePushClosure(ts, (StgClosure *) tso->bq, c, sep, child_data); traversePushClosure(ts, (StgClosure *) tso->trec, c, sep, child_data); - if ( tso->why_blocked == BlockedOnMVar - || tso->why_blocked == BlockedOnMVarRead - || tso->why_blocked == BlockedOnBlackHole - || tso->why_blocked == BlockedOnMsgThrowTo - ) { + switch (tso->why_blocked) { + case BlockedOnMVar: + case BlockedOnMVarRead: + case BlockedOnBlackHole: + case BlockedOnMsgThrowTo: traversePushClosure(ts, tso->block_info.closure, c, sep, child_data); + break; + default: + break; } goto loop; } diff --git a/rts/sm/Compact.c b/rts/sm/Compact.c index f6e65ecc9a25..92ac86779ac9 100644 --- a/rts/sm/Compact.c +++ b/rts/sm/Compact.c @@ -463,13 +463,16 @@ thread_TSO (StgTSO *tso) thread_(&tso->_link); thread_(&tso->global_link); - if ( tso->why_blocked == BlockedOnMVar - || tso->why_blocked == BlockedOnMVarRead - || tso->why_blocked == BlockedOnBlackHole - || tso->why_blocked == BlockedOnMsgThrowTo - || tso->why_blocked == NotBlocked - ) { + switch (tso->why_blocked) { + case BlockedOnMVar: + case BlockedOnMVarRead: + case BlockedOnBlackHole: + case BlockedOnMsgThrowTo: + case NotBlocked: thread_(&tso->block_info.closure); + break; + default: + break; } thread_(&tso->blocked_exceptions); thread_(&tso->bq); diff --git a/rts/sm/NonMovingMark.c b/rts/sm/NonMovingMark.c index ab485f2d0c9b..cfa506303695 100644 --- a/rts/sm/NonMovingMark.c +++ b/rts/sm/NonMovingMark.c @@ -1052,13 +1052,16 @@ trace_tso (MarkQueue *queue, StgTSO *tso) if (tso->label != NULL) { markQueuePushClosure_(queue, (StgClosure *) tso->label); } - if ( tso->why_blocked == BlockedOnMVar - || tso->why_blocked == BlockedOnMVarRead - || tso->why_blocked == BlockedOnBlackHole - || tso->why_blocked == BlockedOnMsgThrowTo - || tso->why_blocked == NotBlocked - ) { + switch (tso->why_blocked) { + case BlockedOnMVar: + case BlockedOnMVarRead: + case BlockedOnBlackHole: + case BlockedOnMsgThrowTo: + case NotBlocked: markQueuePushClosure_(queue, tso->block_info.closure); + break; + default: + break; } } diff --git a/rts/sm/Scav.c b/rts/sm/Scav.c index 8debec6a6662..29012f8ed3dd 100644 --- a/rts/sm/Scav.c +++ b/rts/sm/Scav.c @@ -137,23 +137,24 @@ scavengeTSO (StgTSO *tso) evacuate((StgClosure **)&tso->label); } - if ( tso->why_blocked == BlockedOnMVar - || tso->why_blocked == BlockedOnMVarRead - || tso->why_blocked == BlockedOnBlackHole - || tso->why_blocked == BlockedOnMsgThrowTo - || tso->why_blocked == NotBlocked - ) { + switch (tso->why_blocked) { + case BlockedOnMVar: + case BlockedOnMVarRead: + case BlockedOnBlackHole: + case BlockedOnMsgThrowTo: + case NotBlocked: evacuate(&tso->block_info.closure); - } + break; + default: #if defined(THREADED_RTS) // in the THREADED_RTS, block_info.closure must always point to a // valid closure, because we assume this in throwTo(). In the // non-threaded RTS it might be a FD (for // BlockedOnRead/BlockedOnWrite) or a time value (BlockedOnDelay) - else { tso->block_info.closure = (StgClosure *)END_TSO_QUEUE; - } #endif + break; + } tso->dirty = gct->failed_to_evac; -- GitLab