Flutter Engine
The Flutter Engine
Public Types | Public Member Functions | List of all members
dart::AtomicBitFieldContainer< T > Class Template Reference

#include <bitfield.h>

Inheritance diagram for dart::AtomicBitFieldContainer< T >:
dart::AtomicBitFieldContainerBase

Public Types

using ContainedType = T
 

Public Member Functions

 AtomicBitFieldContainer ()
 
 operator T () const
 
T operator= (T tags)
 
T load (std::memory_order order) const
 
NO_SANITIZE_THREAD T load_ignore_race () const
 
void store (T value, std::memory_order order)
 
bool compare_exchange_weak (T old_tags, T new_tags, std::memory_order order)
 
template<class TargetBitField , std::memory_order order = std::memory_order_relaxed>
TargetBitField::Type Read () const
 
template<class TargetBitField , std::memory_order order = std::memory_order_relaxed>
void UpdateBool (bool value)
 
template<class TargetBitField >
void FetchOr (typename TargetBitField::Type value)
 
template<class TargetBitField >
void Update (typename TargetBitField::Type value)
 
template<class TargetBitField >
void UpdateUnsynchronized (typename TargetBitField::Type value)
 
template<class TargetBitField >
TargetBitField::Type UpdateConditional (typename TargetBitField::Type value_to_be_set, typename TargetBitField::Type conditional_old_value)
 
template<class TargetBitField >
bool TryAcquire ()
 
template<class TargetBitField >
bool TryClear ()
 

Detailed Description

template<typename T>
class dart::AtomicBitFieldContainer< T >

Definition at line 23 of file bitfield.h.

Member Typedef Documentation

◆ ContainedType

template<typename T >
using dart::AtomicBitFieldContainer< T >::ContainedType = T

Definition at line 28 of file bitfield.h.

Constructor & Destructor Documentation

◆ AtomicBitFieldContainer()

template<typename T >
dart::AtomicBitFieldContainer< T >::AtomicBitFieldContainer ( )
inline

Definition at line 30 of file bitfield.h.

30: field_(0) {}

Member Function Documentation

◆ compare_exchange_weak()

template<typename T >
bool dart::AtomicBitFieldContainer< T >::compare_exchange_weak ( T  old_tags,
T  new_tags,
std::memory_order  order 
)
inline

Definition at line 44 of file bitfield.h.

44 {
45 return field_.compare_exchange_weak(old_tags, new_tags, order);
46 }

◆ FetchOr()

template<typename T >
template<class TargetBitField >
void dart::AtomicBitFieldContainer< T >::FetchOr ( typename TargetBitField::Type  value)
inline

Definition at line 65 of file bitfield.h.

65 {
66 field_.fetch_or(TargetBitField::encode(value), std::memory_order_relaxed);
67 }
static void encode(uint8_t output[16], const uint32_t input[4])
Definition: SkMD5.cpp:240
uint8_t value

◆ load()

template<typename T >
T dart::AtomicBitFieldContainer< T >::load ( std::memory_order  order) const
inline

Definition at line 38 of file bitfield.h.

38{ return field_.load(order); }

◆ load_ignore_race()

template<typename T >
NO_SANITIZE_THREAD T dart::AtomicBitFieldContainer< T >::load_ignore_race ( ) const
inline

Definition at line 39 of file bitfield.h.

39 {
40 return *reinterpret_cast<const T*>(&field_);
41 }
#define T
Definition: precompiler.cc:65

◆ operator T()

template<typename T >
dart::AtomicBitFieldContainer< T >::operator T ( ) const
inline

Definition at line 32 of file bitfield.h.

32{ return field_.load(std::memory_order_relaxed); }

◆ operator=()

template<typename T >
T dart::AtomicBitFieldContainer< T >::operator= ( T  tags)
inline

Definition at line 33 of file bitfield.h.

33 {
34 field_.store(tags, std::memory_order_relaxed);
35 return tags;
36 }

◆ Read()

template<typename T >
template<class TargetBitField , std::memory_order order = std::memory_order_relaxed>
TargetBitField::Type dart::AtomicBitFieldContainer< T >::Read ( ) const
inline

Definition at line 50 of file bitfield.h.

50 {
51 return TargetBitField::decode(field_.load(order));
52 }
static DecodeResult decode(std::string path)
Definition: png_codec.cpp:124

◆ store()

template<typename T >
void dart::AtomicBitFieldContainer< T >::store ( T  value,
std::memory_order  order 
)
inline

Definition at line 42 of file bitfield.h.

42{ field_.store(value, order); }

◆ TryAcquire()

template<typename T >
template<class TargetBitField >
bool dart::AtomicBitFieldContainer< T >::TryAcquire ( )
inline

Definition at line 107 of file bitfield.h.

107 {
108 T mask = TargetBitField::encode(true);
109 T old_field = field_.fetch_or(mask, std::memory_order_relaxed);
110 return !TargetBitField::decode(old_field);
111 }

◆ TryClear()

template<typename T >
template<class TargetBitField >
bool dart::AtomicBitFieldContainer< T >::TryClear ( )
inline

Definition at line 114 of file bitfield.h.

114 {
115 T mask = ~TargetBitField::encode(true);
116 T old_field = field_.fetch_and(mask, std::memory_order_relaxed);
117 return TargetBitField::decode(old_field);
118 }

◆ Update()

template<typename T >
template<class TargetBitField >
void dart::AtomicBitFieldContainer< T >::Update ( typename TargetBitField::Type  value)
inline

Definition at line 70 of file bitfield.h.

70 {
71 T old_field = field_.load(std::memory_order_relaxed);
72 T new_field;
73 do {
74 new_field = TargetBitField::update(value, old_field);
75 } while (!field_.compare_exchange_weak(old_field, new_field,
76 std::memory_order_relaxed));
77 }

◆ UpdateBool()

template<typename T >
template<class TargetBitField , std::memory_order order = std::memory_order_relaxed>
void dart::AtomicBitFieldContainer< T >::UpdateBool ( bool  value)
inline

Definition at line 56 of file bitfield.h.

56 {
57 if (value) {
58 field_.fetch_or(TargetBitField::encode(true), order);
59 } else {
60 field_.fetch_and(~TargetBitField::encode(true), order);
61 }
62 }

◆ UpdateConditional()

template<typename T >
template<class TargetBitField >
TargetBitField::Type dart::AtomicBitFieldContainer< T >::UpdateConditional ( typename TargetBitField::Type  value_to_be_set,
typename TargetBitField::Type  conditional_old_value 
)
inline

Definition at line 87 of file bitfield.h.

89 {
90 T old_field = field_.load(std::memory_order_relaxed);
91 while (true) {
92 // This operation is only performed if the condition is met.
93 auto old_value = TargetBitField::decode(old_field);
94 if (old_value != conditional_old_value) {
95 return old_value;
96 }
97 T new_tags = TargetBitField::update(value_to_be_set, old_field);
98 if (field_.compare_exchange_weak(old_field, new_tags,
99 std::memory_order_relaxed)) {
100 return value_to_be_set;
101 }
102 // [old_tags] was updated to it's current value.
103 }
104 }

◆ UpdateUnsynchronized()

template<typename T >
template<class TargetBitField >
void dart::AtomicBitFieldContainer< T >::UpdateUnsynchronized ( typename TargetBitField::Type  value)
inline

Definition at line 80 of file bitfield.h.

80 {
81 field_.store(
82 TargetBitField::update(value, field_.load(std::memory_order_relaxed)),
83 std::memory_order_relaxed);
84 }

The documentation for this class was generated from the following file: