proxygen
folly::detail::RingBufferSlot< T, Atom > Class Template Reference

#include <LockFreeRingBuffer.h>

Public Member Functions

 RingBufferSlot () noexcept
 
void write (const uint32_t turn, T &value) noexcept
 
bool waitAndTryRead (T &dest, uint32_t turn) noexcept
 
bool tryRead (T &dest, uint32_t turn) noexcept
 

Private Attributes

TurnSequencer< Atomsequencer_
 
T data
 

Detailed Description

template<typename T, template< typename > class Atom>
class folly::detail::RingBufferSlot< T, Atom >

Definition at line 36 of file LockFreeRingBuffer.h.

Constructor & Destructor Documentation

template<typename T, template< typename > class Atom>
folly::detail::RingBufferSlot< T, Atom >::RingBufferSlot ( )
inlineexplicitnoexcept

Definition at line 184 of file LockFreeRingBuffer.h.

Member Function Documentation

template<typename T, template< typename > class Atom>
bool folly::detail::RingBufferSlot< T, Atom >::tryRead ( T dest,
uint32_t  turn 
)
inlinenoexcept

Definition at line 211 of file LockFreeRingBuffer.h.

References folly::data(), upload::dest, and folly::T.

211  {
212  // The write that started at turn 0 ended at turn 2
213  if (!sequencer_.isTurn((turn + 1) * 2)) {
214  return false;
215  }
216  memcpy(&dest, &data, sizeof(T));
217 
218  // if it's still the same turn, we read the value successfully
219  return sequencer_.isTurn((turn + 1) * 2);
220  }
dest
Definition: upload.py:394
folly::std T
TurnSequencer< Atom > sequencer_
template<typename T, template< typename > class Atom>
bool folly::detail::RingBufferSlot< T, Atom >::waitAndTryRead ( T dest,
uint32_t  turn 
)
inlinenoexcept

Definition at line 198 of file LockFreeRingBuffer.h.

References folly::data(), upload::dest, folly::T, and uint32_t.

198  {
199  uint32_t desired_turn = (turn + 1) * 2;
200  Atom<uint32_t> cutoff(0);
201  if (sequencer_.tryWaitForTurn(desired_turn, cutoff, false) !=
203  return false;
204  }
205  memcpy(&dest, &data, sizeof(T));
206 
207  // if it's still the same turn, we read the value successfully
208  return sequencer_.isTurn(desired_turn);
209  }
dest
Definition: upload.py:394
folly::std T
TurnSequencer< Atom > sequencer_
template<typename T, template< typename > class Atom>
void folly::detail::RingBufferSlot< T, Atom >::write ( const uint32_t  turn,
T value 
)
inlinenoexcept

Definition at line 186 of file LockFreeRingBuffer.h.

References folly::data(), folly::gen::move, and folly::value().

186  {
187  Atom<uint32_t> cutoff(0);
188  sequencer_.waitForTurn(turn * 2, cutoff, false);
189 
190  // Change to an odd-numbered turn to indicate write in process
191  sequencer_.completeTurn(turn * 2);
192 
193  data = std::move(value);
194  sequencer_.completeTurn(turn * 2 + 1);
195  // At (turn + 1) * 2
196  }
constexpr detail::Map< Move > move
Definition: Base-inl.h:2567
TurnSequencer< Atom > sequencer_
uint64_t value(const typename LockFreeRingBuffer< T, Atom >::Cursor &rbcursor)

Member Data Documentation

template<typename T, template< typename > class Atom>
T folly::detail::RingBufferSlot< T, Atom >::data
private

Definition at line 224 of file LockFreeRingBuffer.h.

template<typename T, template< typename > class Atom>
TurnSequencer<Atom> folly::detail::RingBufferSlot< T, Atom >::sequencer_
private

Definition at line 223 of file LockFreeRingBuffer.h.


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