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