Skip to content

Commit 6a781b9

Browse files
committed
Only shuffle at most the first half of the runqueue
1 parent ad93f94 commit 6a781b9

File tree

1 file changed

+8
-4
lines changed

1 file changed

+8
-4
lines changed

io-sim/src/Control/Monad/IOSim/Internal.hs

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -853,13 +853,17 @@ unblockThreads !onlySTM !wakeup !simstate@SimState {runqueue, threads, stdGen} =
853853
-- To preserve our invariants (that threadBlocked is correct)
854854
-- we update the runqueue and threads together here
855855
(unblocked, simstate {
856-
runqueue = Deque.fromList shuffledRunqueue,
856+
runqueue = Deque.fromList (shuffledRunqueue ++ rest),
857857
threads = threads',
858-
stdGen = stdGen'
858+
stdGen = stdGen''
859859
})
860860
where
861-
!(shuffledRunqueue, stdGen') = fisherYatesShuffle stdGen runqueue'
862-
!runqueue' = Deque.toList $ runqueue <> Deque.fromList unblocked
861+
!(shuffledRunqueue, stdGen'') = fisherYatesShuffle stdGen' toShuffle
862+
!((toShuffle, rest), stdGen') =
863+
let runqueueList = Deque.toList $ runqueue <> Deque.fromList unblocked
864+
runqueueListLength = max 1 (length runqueueList)
865+
(ix, newGen) = randomR (0, runqueueListLength `div` 2) stdGen
866+
in (splitAt ix runqueueList, newGen)
863867
-- can only unblock if the thread exists and is blocked (not running)
864868
!unblocked = [ tid
865869
| tid <- wakeup

0 commit comments

Comments
 (0)