54 lines
1.3 KiB
C++
54 lines
1.3 KiB
C++
// Copyright 2016 The Chromium Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style license that can be
|
|
// found in the LICENSE file.
|
|
|
|
#ifndef MOJO_CORE_ATOMIC_FLAG_H_
|
|
#define MOJO_CORE_ATOMIC_FLAG_H_
|
|
|
|
#include "base/atomicops.h"
|
|
#include "base/macros.h"
|
|
|
|
namespace mojo {
|
|
namespace core {
|
|
|
|
// AtomicFlag is a boolean flag that can be set and tested atomically. It is
|
|
// intended to be used to fast-path checks where the common case would normally
|
|
// release the governing mutex immediately after checking.
|
|
//
|
|
// Example usage:
|
|
// void DoFoo(Bar* bar) {
|
|
// AutoLock l(lock_);
|
|
// queue_.push_back(bar);
|
|
// flag_.Set(true);
|
|
// }
|
|
//
|
|
// void Baz() {
|
|
// if (!flag_) // Assume this is the common case.
|
|
// return;
|
|
//
|
|
// AutoLock l(lock_);
|
|
// ... drain queue_ ...
|
|
// flag_.Set(false);
|
|
// }
|
|
class AtomicFlag {
|
|
public:
|
|
AtomicFlag() : flag_(0) {}
|
|
~AtomicFlag() {}
|
|
|
|
void Set(bool value) { base::subtle::Release_Store(&flag_, value ? 1 : 0); }
|
|
|
|
bool Get() const { return base::subtle::Acquire_Load(&flag_) ? true : false; }
|
|
|
|
operator const bool() const { return Get(); }
|
|
|
|
private:
|
|
base::subtle::Atomic32 flag_;
|
|
|
|
DISALLOW_COPY_AND_ASSIGN(AtomicFlag);
|
|
};
|
|
|
|
} // namespace core
|
|
} // namespace mojo
|
|
|
|
#endif // MOJO_CORE_ATOMIC_FLAG_H_
|