8#ifndef INCLUDED_BSLS_SPINLOCK
9#define INCLUDED_BSLS_SPINLOCK
309#include <bsls_assert.h>
316#if (BSLS_COMPILERFEATURES_CPLUSPLUS < 201703L)
317#define BSLS_SPINLOCK_USES_AGGREGATE_INITIALIZATION
325#ifdef BSLS_SPINLOCK_USES_AGGREGATE_INITIALIZATION
326#define BSLS_SPINLOCK_UNLOCKED { {0} }
328#define BSLS_SPINLOCK_UNLOCKED (::BloombergLP::bsls::SpinLock::s_unlocked)
331#ifdef BSLS_PLATFORM_OS_WINDOWS
332typedef unsigned long DWORD;
336 __declspec(dllimport)
void __stdcall Sleep(
337 DWORD dwMilliseconds);
339 __declspec(dllimport) DWORD __stdcall SleepEx(
340 DWORD dwMilliseconds,
387#ifdef BSLS_SPINLOCK_USES_AGGREGATE_INITIALIZATION
411 static void doBackoff(
int *count);
421 static void sleepMillis(
int milliseconds);
431#ifdef BSLS_SPINLOCK_USES_AGGREGATE_INITIALIZATION
444 AtomicOperations::AtomicTypes::Int
d_state;
449#ifndef BSLS_SPINLOCK_USES_AGGREGATE_INITIALIZATION
461#ifdef BSLS_SPINLOCK_USES_AGGREGATE_INITIALIZATION
496 int tryLock(
int numRetries = 0);
550#ifndef BSLS_SPINLOCK_USES_AGGREGATE_INITIALIZATION
551constexpr SpinLock::SpinLock()
556constexpr SpinLock::SpinLock(
const SpinLock_MemberInitializer&)
564void SpinLock::doBackoff(
int *count) {
577void SpinLock::sleepMillis(
int milliseconds)
579#ifdef BSLS_PLATFORM_OS_WINDOWS
580 ::Sleep(milliseconds);
584 naptime.tv_nsec = 1000 * 1000 * milliseconds;
585 nanosleep(&naptime, 0);
590void SpinLock::yield() {
591#ifdef BSLS_PLATFORM_OS_WINDOWS
649 }
while (numRetries--);
689#undef BSLS_SPINLOCK_USES_AGGREGATE_INITIALIZATION
Definition bsls_spinlock.h:511
SpinLock * release()
Definition bsls_spinlock.h:680
~SpinLockGuard()
Definition bsls_spinlock.h:671
Definition bsls_spinlock.h:362
#define BSLS_ASSERT_SAFE(X)
Definition bsls_assert.h:1917
#define BSLS_IDENT(str)
BSLS_IDENT() - insert string into .comment binary segment (if supported)
Definition bsls_ident.h:238
#define BSLS_KEYWORD_DELETED
Definition bsls_keyword.h:651
Definition bdlt_iso8601util.h:707
static int getIntAcquire(AtomicTypes::Int const *atomicInt)
Definition bsls_atomicoperations.h:1530
static void setIntRelease(AtomicTypes::Int *atomicInt, int value)
Definition bsls_atomicoperations.h:1560
static int getInt(AtomicTypes::Int const *atomicInt)
Definition bsls_atomicoperations.h:1524
static int swapIntAcqRel(AtomicTypes::Int *atomicInt, int swapValue)
Definition bsls_atomicoperations.h:1572
Definition bsls_spinlock.h:383
void lockWithBackoff()
Definition bsls_spinlock.h:605
int tryLock(int numRetries=0)
Definition bsls_spinlock.h:637
void lockWithoutBackoff()
Definition bsls_spinlock.h:622
static const SpinLock s_unlocked
Definition bsls_spinlock.h:462
void lock()
Definition bsls_spinlock.h:600
void unlock()
Definition bsls_spinlock.h:654
AtomicOperations::AtomicTypes::Int d_state
Definition bsls_spinlock.h:438