xref: /aosp_15_r20/external/libchrome/base/synchronization/atomic_flag.cc (revision 635a864187cb8b6c713ff48b7e790a6b21769273)
1*635a8641SAndroid Build Coastguard Worker // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2*635a8641SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*635a8641SAndroid Build Coastguard Worker // found in the LICENSE file.
4*635a8641SAndroid Build Coastguard Worker 
5*635a8641SAndroid Build Coastguard Worker #include "base/synchronization/atomic_flag.h"
6*635a8641SAndroid Build Coastguard Worker 
7*635a8641SAndroid Build Coastguard Worker #include "base/logging.h"
8*635a8641SAndroid Build Coastguard Worker 
9*635a8641SAndroid Build Coastguard Worker namespace base {
10*635a8641SAndroid Build Coastguard Worker 
AtomicFlag()11*635a8641SAndroid Build Coastguard Worker AtomicFlag::AtomicFlag() {
12*635a8641SAndroid Build Coastguard Worker   // It doesn't matter where the AtomicFlag is built so long as it's always
13*635a8641SAndroid Build Coastguard Worker   // Set() from the same sequence after. Note: the sequencing requirements are
14*635a8641SAndroid Build Coastguard Worker   // necessary for IsSet()'s callers to know which sequence's memory operations
15*635a8641SAndroid Build Coastguard Worker   // they are synchronized with.
16*635a8641SAndroid Build Coastguard Worker   set_sequence_checker_.DetachFromSequence();
17*635a8641SAndroid Build Coastguard Worker }
18*635a8641SAndroid Build Coastguard Worker 
Set()19*635a8641SAndroid Build Coastguard Worker void AtomicFlag::Set() {
20*635a8641SAndroid Build Coastguard Worker   DCHECK(set_sequence_checker_.CalledOnValidSequence());
21*635a8641SAndroid Build Coastguard Worker   base::subtle::Release_Store(&flag_, 1);
22*635a8641SAndroid Build Coastguard Worker }
23*635a8641SAndroid Build Coastguard Worker 
IsSet() const24*635a8641SAndroid Build Coastguard Worker bool AtomicFlag::IsSet() const {
25*635a8641SAndroid Build Coastguard Worker   return base::subtle::Acquire_Load(&flag_) != 0;
26*635a8641SAndroid Build Coastguard Worker }
27*635a8641SAndroid Build Coastguard Worker 
UnsafeResetForTesting()28*635a8641SAndroid Build Coastguard Worker void AtomicFlag::UnsafeResetForTesting() {
29*635a8641SAndroid Build Coastguard Worker   base::subtle::Release_Store(&flag_, 0);
30*635a8641SAndroid Build Coastguard Worker }
31*635a8641SAndroid Build Coastguard Worker 
32*635a8641SAndroid Build Coastguard Worker }  // namespace base
33