mirror of
https://github.com/odin-lang/Odin.git
synced 2025-12-30 18:02:02 +00:00
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}.
This commit is contained in:
@@ -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]
|
||||
|
||||
Reference in New Issue
Block a user