Skip to content

Commit fa35265

Browse files
rmacnak-googleCommit Queue
authored andcommitted
[vm, gc] Fix race between BlockForSafepoint and TryStealActiveMutator.
This race can result in the stolen bit becoming cleared and the same thread stolen from multiple tests. TEST=vm/dart/isolates/many_isolates_blocked_at_process_run_sync_test Change-Id: I737458ff48e9d01ddfe4e5a016ef57e4cbdbf292 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/425740 Reviewed-by: Alexander Aprelev <[email protected]> Commit-Queue: Ryan Macnak <[email protected]>
1 parent 796ae39 commit fa35265

File tree

1 file changed

+6
-2
lines changed

1 file changed

+6
-2
lines changed

runtime/vm/thread.h

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1021,8 +1021,12 @@ class Thread : public ThreadState {
10211021
}
10221022
void SetBlockedForSafepoint(bool value) {
10231023
ASSERT(thread_lock()->IsOwnedByCurrentThread());
1024-
safepoint_state_ =
1025-
BlockedForSafepointField::update(value, safepoint_state_);
1024+
const uword mask = BlockedForSafepointField::mask_in_place();
1025+
if (value) {
1026+
safepoint_state_.fetch_or(mask);
1027+
} else {
1028+
safepoint_state_.fetch_and(~mask);
1029+
}
10261030
}
10271031
bool BypassSafepoints() const {
10281032
return BypassSafepointsField::decode(safepoint_state_);

0 commit comments

Comments
 (0)