Mixe for Privacy and Anonymity in the Internet
Classes | Namespaces | Macros | Enumerations | Functions
atomicops.h File Reference
#include <cassert>
#include <type_traits>
#include <cerrno>
#include <cstdint>
#include <ctime>
#include <atomic>
#include <utility>
Include dependency graph for atomicops.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Classes

class  weak_atomic< T >
 
class  spsc_sema::LightweightSemaphore
 

Namespaces

 spsc_sema
 

Macros

#define AE_ARCH_UNKNOWN
 
#define AE_UNUSED(x)   ((void)x)
 
#define AE_NO_TSAN
 
#define AE_FORCEINLINE   inline
 
#define AE_ALIGN(x)   __attribute__((aligned(x)))
 
#define AE_USE_STD_ATOMIC_FOR_WEAK_ATOMIC
 

Enumerations

enum  memory_order {
  memory_order_relaxed , memory_order_acquire , memory_order_release , memory_order_acq_rel ,
  memory_order_seq_cst , memory_order_sync = memory_order_seq_cst
}
 

Functions

AE_FORCEINLINE void compiler_fence (memory_order order) AE_NO_TSAN
 
AE_FORCEINLINE void fence (memory_order order) AE_NO_TSAN
 

Macro Definition Documentation

◆ AE_ALIGN

#define AE_ALIGN (   x)    __attribute__((aligned(x)))

Definition at line 75 of file atomicops.h.

◆ AE_ARCH_UNKNOWN

#define AE_ARCH_UNKNOWN

Definition at line 38 of file atomicops.h.

◆ AE_FORCEINLINE

#define AE_FORCEINLINE   inline

Definition at line 64 of file atomicops.h.

◆ AE_NO_TSAN

#define AE_NO_TSAN

Definition at line 53 of file atomicops.h.

◆ AE_UNUSED

#define AE_UNUSED (   x)    ((void)x)

Definition at line 43 of file atomicops.h.

◆ AE_USE_STD_ATOMIC_FOR_WEAK_ATOMIC

#define AE_USE_STD_ATOMIC_FOR_WEAK_ATOMIC

Definition at line 220 of file atomicops.h.

Enumeration Type Documentation

◆ memory_order

Enumerator
memory_order_relaxed 
memory_order_acquire 
memory_order_release 
memory_order_acq_rel 
memory_order_seq_cst 
memory_order_sync 

Definition at line 82 of file atomicops.h.

82  {
88 
89  // memory_order_sync: Forces a full sync:
90  // #LoadLoad, #LoadStore, #StoreStore, and most significantly, #StoreLoad
92 };
@ memory_order_seq_cst
Definition: atomicops.h:87
@ memory_order_sync
Definition: atomicops.h:91
@ memory_order_release
Definition: atomicops.h:85
@ memory_order_relaxed
Definition: atomicops.h:83
@ memory_order_acq_rel
Definition: atomicops.h:86
@ memory_order_acquire
Definition: atomicops.h:84

Function Documentation

◆ compiler_fence()

AE_FORCEINLINE void compiler_fence ( memory_order  order)

Definition at line 191 of file atomicops.h.

192 {
193  switch (order) {
194  case memory_order_relaxed: break;
195  case memory_order_acquire: std::atomic_signal_fence(std::memory_order_acquire); break;
196  case memory_order_release: std::atomic_signal_fence(std::memory_order_release); break;
197  case memory_order_acq_rel: std::atomic_signal_fence(std::memory_order_acq_rel); break;
198  case memory_order_seq_cst: std::atomic_signal_fence(std::memory_order_seq_cst); break;
199  default: assert(false);
200  }
201 }

References memory_order_acq_rel, memory_order_acquire, memory_order_relaxed, memory_order_release, and memory_order_seq_cst.

Referenced by ReaderWriterQueue::pop(), ReaderWriterQueue::try_dequeue(), and spsc_sema::LightweightSemaphore::waitWithPartialSpinning().

Here is the caller graph for this function:

◆ fence()

AE_FORCEINLINE void fence ( memory_order  order)

Definition at line 203 of file atomicops.h.

204 {
205  switch (order) {
206  case memory_order_relaxed: break;
207  case memory_order_acquire: std::atomic_thread_fence(std::memory_order_acquire); break;
208  case memory_order_release: std::atomic_thread_fence(std::memory_order_release); break;
209  case memory_order_acq_rel: std::atomic_thread_fence(std::memory_order_acq_rel); break;
210  case memory_order_seq_cst: std::atomic_thread_fence(std::memory_order_seq_cst); break;
211  default: assert(false);
212  }
213 }

References memory_order_acq_rel, memory_order_acquire, memory_order_relaxed, memory_order_release, and memory_order_seq_cst.

Referenced by ReaderWriterQueue::inner_enqueue(), ReaderWriterQueue::peek(), ReaderWriterQueue::pop(), ReaderWriterQueue::ReaderWriterQueue(), ReaderWriterQueue::size_approx(), ReaderWriterQueue::try_dequeue(), and ReaderWriterQueue::~ReaderWriterQueue().

Here is the caller graph for this function: