8#ifndef INCLUDED_BSLMT_ONCE
9#define INCLUDED_BSLMT_ONCE
387#include <bslscm_version.h>
397#include <bsl_exception.h>
401#if defined(BSLS_PLATFORM_CMP_MSVC)
402# define BSLMT_ONCE_UNIQNUM __COUNTER__
407# define BSLMT_ONCE_UNIQNUM __LINE__
427#define BSLMT_ONCE_DO \
428 BSLMT_ONCE_DO_IMP(BSLMT_ONCE_CAT(bslmt_doOnceObj, BSLMT_ONCE_UNIQNUM))
438#define BSLMT_ONCE_CANCEL() bslmt_doOnceGuard.cancel()
444#define BSLMT_ONCE_INITIALIZER { BSLMT_QLOCK_INITIALIZER, { 0 } }
461 enum { e_NOT_ENTERED, e_IN_PROGRESS, e_DONE };
477 bsls::AtomicOperations::AtomicTypes::Int
d_state;
532 template <
class FUNC>
534 template <
class FUNC>
535 void callOnce(
const FUNC& function);
558 enum State { e_NOT_ENTERED, e_IN_PROGRESS, e_DONE };
564 int d_num_exceptions;
630#define BSLMT_ONCE_CAT(X, Y) BSLMT_ONCE_CAT_IMP(X, Y)
631#define BSLMT_ONCE_CAT_IMP(X, Y) X##Y
640#define BSLMT_ONCE_DO_IMP(doOnceObj) \
641 static BloombergLP::bslmt::Once doOnceObj = BSLMT_ONCE_INITIALIZER; \
642 if (BSLS_PERFORMANCEHINT_PREDICT_UNLIKELY( \
643 doOnceObj.isMaybeUninitialized())) \
644 for (BloombergLP::bslmt::OnceGuard \
645 bslmt_doOnceGuard(&doOnceObj);\
646 bslmt_doOnceGuard.enter(); bslmt_doOnceGuard.leave())
654OnceGuard::OnceGuard(
Once *once)
656, d_state(e_NOT_ENTERED)
657, d_num_exceptions(
bsl::uncaught_exceptions())
668 d_state = e_NOT_ENTERED;
675 return e_IN_PROGRESS == d_state;
689#ifdef BDE_BUILD_TARGET_EXC
709#ifdef BDE_BUILD_TARGET_EXC
733#if !defined(BSL_DOUBLE_UNDERSCORE_XLAT) || 1 == BSL_DOUBLE_UNDERSCORE_XLAT
734#define BSLMT_ONCE__CAT(X, Y) BSLMT_ONCE_CAT(X, Y)
Definition bslmt_once.h:555
bool isInProgress() const
Definition bslmt_once.h:673
void setOnce(Once *once)
Definition bslmt_once.h:663
Definition bslmt_once.h:458
QLock d_mutex
Definition bslmt_once.h:475
bool enter(OnceLock *onceLock)
bool isMaybeUninitialized() const
Definition bslmt_once.h:725
void leave(OnceLock *onceLock)
void callOnce(FUNC &function)
Definition bslmt_once.h:685
bsls::AtomicOperations::AtomicTypes::Int d_state
Definition bslmt_once.h:477
void cancel(OnceLock *onceLock)
QLockGuard OnceLock
Definition bslmt_once.h:485
Definition bslmt_qlock.h:388
#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
Definition bdlat_valuetypefunctions.h:939
Definition bslmt_barrier.h:344
Definition bslmt_qlock.h:273
static int getIntAcquire(AtomicTypes::Int const *atomicInt)
Definition bsls_atomicoperations.h:1530