Bladeren bron

core/sync/chan.try_select_raw: test hook for testing the toctou

This is necessary because we need to allow the test guarantee against a
rare condition: where a third-party thread steals a value between the
validity checks can_{send,recv} and the channel operation
try_{send,recv}.
Jack Mordaunt 3 maanden geleden
bovenliggende
commit
faae81ba61
1 gewijzigde bestanden met toevoegingen van 14 en 0 verwijderingen
  1. 14 0
      core/sync/chan/chan.odin

+ 14 - 0
core/sync/chan/chan.odin

@@ -7,6 +7,14 @@ import "core:mem"
 import "core:sync"
 import "core:math/rand"
 
+when ODIN_TEST {
+/*
+Hook for testing _try_select_raw allowing the test harness to manipulate the
+channels prior to the select actually operating on them.
+*/
+__try_select_raw_pause : proc() = nil
+}
+
 /*
 Determines what operations `Chan` supports.
 */
@@ -1221,6 +1229,12 @@ try_select_raw :: proc "odin" (recvs: []^Raw_Chan, sends: []^Raw_Chan, send_msgs
 			return -1, .None
 		}
 
+		when ODIN_TEST {
+			if __try_select_raw_pause != nil {
+				__try_select_raw_pause()
+			}
+		}
+
 		candidate_idx := rand.int_max(count) if count > 0 else 0
 
 		sel := candidates[candidate_idx]