33#ifndef MADNESS_WORLD_WORLDMUTEX_H__INCLUDED
34#define MADNESS_WORLD_WORLDMUTEX_H__INCLUDED
43#define MADNESS_COMPILER_BARRIER std::atomic_signal_fence(std::memory_order_seq_cst)
47#define MADNESS_MEMORY_STORE_BARRIER std::atomic_thread_fence(std::memory_order_release)
52#define MADNESS_MEMORY_LOAD_BARRIER std::atomic_thread_fence(std::memory_order_acquire)
60#if __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ >= 101200
65typedef std::remove_pointer<os_unfair_lock_t>::type pthread_spinlock_t;
67inline void pthread_spin_init(pthread_spinlock_t*
p,
int ) {
68 *
p = OS_UNFAIR_LOCK_INIT;
70inline int pthread_spin_trylock(pthread_spinlock_t*
p) {
71 return !os_unfair_lock_trylock(
p);
73inline int pthread_spin_lock(pthread_spinlock_t*
p) {
74 os_unfair_lock_lock(
p);
77inline int pthread_spin_unlock(pthread_spinlock_t*
p) {
78 os_unfair_lock_unlock(
p);
82inline int pthread_spin_destroy(pthread_spinlock_t*) {
88#include <libkern/OSAtomic.h>
89typedef OSSpinLock pthread_spinlock_t;
91inline void pthread_spin_init(pthread_spinlock_t*
p,
int ) {
94inline int pthread_spin_trylock(pthread_spinlock_t*
p) {
95 return !OSSpinLockTry(
p);
97inline int pthread_spin_lock(pthread_spinlock_t*
p) {
101inline int pthread_spin_unlock(pthread_spinlock_t*
p) {
105inline void pthread_spin_destroy(pthread_spinlock_t* ) {}
135#if !defined(HAVE_IBMBGP) && !defined(HAVE_IBMBGQ)
164 const int result = pthread_mutex_init(&
mutex, 0);
170 return pthread_mutex_trylock(&
mutex)==0;
175 const int result = pthread_mutex_lock(&
mutex);
177 fprintf(stderr,
"!! MADNESS ERROR: Mutex::lock() failed acquiring mutex\n");
185 const int result = pthread_mutex_unlock(&
mutex);
187 fprintf(stderr,
"!! MADNESS ERROR: Mutex::unlock() failed releasing mutex\n");
194 pthread_mutex_t*
ptr()
const {
199 pthread_mutex_destroy(&
mutex);
220 return pthread_mutex_trylock(&
mutex)==0;
225 int result = pthread_mutex_lock(&
mutex);
227 fprintf(stderr,
"!! MADNESS ERROR: RecursiveMutex::lock() failed acquiring mutex\n");
235 int result = pthread_mutex_unlock(&
mutex);
237 fprintf(stderr,
"!! MADNESS ERROR: RecursiveMutex::unlock() failed releasing mutex\n");
244 pthread_mutex_t*
ptr()
const {
249 pthread_mutex_destroy(&
mutex);
257 template <
class mutexT = Mutex>
269 typedef Mutex Spinlock;
287 pthread_spin_init(&
spinlock, PTHREAD_PROCESS_PRIVATE);
292 return pthread_spin_trylock(&
spinlock)==0;
297 int result = pthread_spin_lock(&
spinlock);
299 fprintf(stderr,
"!! MADNESS ERROR: Spinlock::lock() failed acquiring spinlock\n");
307 int result = pthread_spin_unlock(&
spinlock);
309 fprintf(stderr,
"!! MADNESS ERROR: Spinlock::unlock() failed releasing spinlock\n");
356 else if (lockmode ==
NOLOCK) {
382 void lock(
int lockmode)
const {
426 enum {UNLOCKED, LOCKED};
441 return (
writeflag.compare_and_swap((
int) UNLOCKED, (
int) LOCKED) == 0);
451 else if (lockmode ==
NOLOCK) {
477 void lock(
int lockmode)
const {
489 void unlock(
int lockmode)
const {
536 volatile bool myturn =
false;
544 while (!myturn) std::this_thread::yield();
546 while (!myturn) std::this_thread::sleep_for(this->
wait_usleep_);
556 if (f == this->back)
return;
593 volatile bool myturn =
false;
611 volatile bool*
p = 0;
629 got_lock = (nn == 0);
630 if (got_lock)
n = nn + 1;
656 mutable pthread_cond_t
cv;
661 pthread_cond_init(&
cv,
nullptr);
662 pthread_mutex_init(&
mutex, 0);
670 int result = pthread_mutex_lock(&
mutex);
672 fprintf(stderr,
"!! MADNESS ERROR: PthreadConditionVariable::lock() failed acquiring mutex\n");
674 MADNESS_EXCEPTION(
"PthreadConditionVariable::lock() failed acquiring mutex", result);
679 int result = pthread_mutex_unlock(&
mutex);
681 fprintf(stderr,
"!! MADNESS ERROR: PthreadConditionVariable::unlock() failed releasing mutex\n");
683 MADNESS_EXCEPTION(
"PthreadConditionVariable::unlock() failed releasing mutex", result);
693 int result = pthread_cond_signal(&
cv);
698 int result = pthread_cond_broadcast(&
cv);
703 pthread_mutex_destroy(&
mutex);
704 pthread_cond_destroy(&
cv);
752 pflag->store(!
sense.load(std::memory_order_relaxed), std::memory_order_relaxed);
766 const bool lsense =
sense.load(std::memory_order_relaxed);
773 sense.store(!lsense, std::memory_order_relaxed);
783 for (
int i = 0; i <
nthread; ++i)
784 pflags[i]->store(lsense, std::memory_order_relaxed);
787 std::atomic<bool>* myflag =
pflags[id];
793 while (myflag->load(std::memory_order_relaxed) != lsense) {
Disables default copy constructor and assignment operators.
Definition nodefaults.h:49
An integer with atomic set, get, read+increment, read+decrement, and decrement+test operations.
Definition atomicint.h:126
bool dec_and_test()
Decrements the counter and returns true if the new value is zero,.
Definition atomicint.h:297
Definition worldmutex.h:730
const int nthread
Definition worldmutex.h:732
void register_thread(int id, std::atomic< bool > *pflag)
Each thread calls this once before first use.
Definition worldmutex.h:749
std::atomic< bool > * pflags[MAX_NTHREAD]
Definition worldmutex.h:735
static const int MAX_NTHREAD
Definition worldmutex.h:731
AtomicInt nworking
Definition worldmutex.h:734
bool enter(const int id)
Each thread calls this with its id (0,..,nthread-1) to enter the barrier.
Definition worldmutex.h:760
Barrier(int nthread)
Definition worldmutex.h:738
std::atomic< bool > sense
Definition worldmutex.h:733
Scalable and fair condition variable (spins on local value)
Definition worldmutex.h:516
void wait() const
You should acquire the mutex before waiting.
Definition worldmutex.h:532
int front
Definition worldmutex.h:520
void signal() const
You should acquire the mutex before signalling.
Definition worldmutex.h:554
void broadcast() const
You should acquire the mutex before broadcasting.
Definition worldmutex.h:563
int back
Definition worldmutex.h:519
static const int MAX_NTHREAD
Definition worldmutex.h:518
virtual ~ConditionVariable()
Definition worldmutex.h:568
volatile bool * fifo[MAX_NTHREAD]
Definition worldmutex.h:521
ConditionVariable()
Definition worldmutex.h:529
std::chrono::microseconds wait_usleep_
Definition worldmutex.h:572
void set_wait_policy(WaitPolicy p, int us=0)
Definition worldmutex.h:523
WaitPolicy wait_policy_
Definition worldmutex.h:571
A scalable and fair mutex (not recursive)
Definition worldmutex.h:581
bool try_lock() const
Definition worldmutex.h:624
void lock() const
Definition worldmutex.h:592
int front
Definition worldmutex.h:586
MutexFair()
Definition worldmutex.h:590
static const int MAX_NTHREAD
Definition worldmutex.h:583
void unlock() const
Definition worldmutex.h:610
int n
Definition worldmutex.h:585
int back
Definition worldmutex.h:587
volatile bool * q[MAX_NTHREAD]
Definition worldmutex.h:584
Definition worldmutex.h:325
void convert_read_lock_to_write_lock() const
Converts read to write lock without releasing the read lock.
Definition worldmutex.h:407
void write_unlock() const
Definition worldmutex.h:391
static const int WRITELOCK
Definition worldmutex.h:331
void convert_write_lock_to_read_lock() const
Always succeeds immediately.
Definition worldmutex.h:412
virtual ~MutexReaderWriter()
Definition worldmutex.h:417
bool try_read_lock() const
Definition worldmutex.h:335
MutexReaderWriter()
Definition worldmutex.h:333
static const int READLOCK
Definition worldmutex.h:330
void lock(int lockmode) const
Definition worldmutex.h:382
int nreader
Definition worldmutex.h:326
bool try_lock(int lockmode) const
Definition worldmutex.h:349
void unlock(int lockmode) const
Definition worldmutex.h:398
static const int NOLOCK
Definition worldmutex.h:329
void write_lock() const
Definition worldmutex.h:378
void read_lock() const
Definition worldmutex.h:374
bool try_write_lock() const
Definition worldmutex.h:342
bool writeflag
Definition worldmutex.h:327
bool try_convert_read_lock_to_write_lock() const
Definition worldmutex.h:364
void read_unlock() const
Definition worldmutex.h:386
Definition worldmutex.h:128
void wait()
Definition worldmutex.cc:103
MutexWaiter()
Definition worldmutex.h:141
unsigned int count
Definition worldmutex.h:130
void yield(int us)
Definition worldmutex.h:134
void reset()
Definition worldmutex.h:143
Mutex using pthread mutex operations.
Definition worldmutex.h:150
pthread_mutex_t mutex
Definition worldmutex.h:152
pthread_mutex_t * ptr() const
Return a pointer to the pthread mutex for use by a condition variable.
Definition worldmutex.h:194
void operator=(const Mutex &)
Assignment is forbidden.
Mutex(const Mutex &)
Copy constructor is forbidden.
Mutex(int junk=0)
Make and initialize a mutex ... initial state is unlocked.
Definition worldmutex.h:162
void unlock() const
Free a mutex owned by this thread.
Definition worldmutex.h:184
virtual ~Mutex()
Definition worldmutex.h:198
bool try_lock() const
Try to acquire the mutex ... return true on success, false on failure.
Definition worldmutex.h:169
void lock() const
Acquire the mutex waiting if necessary.
Definition worldmutex.h:174
Simple wrapper for Pthread condition variable with its own mutex.
Definition worldmutex.h:654
pthread_mutex_t mutex
Definition worldmutex.h:657
void lock() const
Definition worldmutex.h:669
pthread_cond_t cv
Definition worldmutex.h:656
virtual ~PthreadConditionVariable()
Definition worldmutex.h:702
void unlock() const
Definition worldmutex.h:678
void broadcast() const
Definition worldmutex.h:697
void signal() const
Definition worldmutex.h:692
pthread_mutex_t & get_pthread_mutex()
Definition worldmutex.h:665
void wait() const
You should have acquired the mutex before entering here.
Definition worldmutex.h:688
PthreadConditionVariable()
Definition worldmutex.h:660
Recursive mutex using pthread mutex operations.
Definition worldmutex.h:204
void operator=(const RecursiveMutex &)
Assignment is forbidden.
void lock() const
Acquire the mutex waiting if necessary.
Definition worldmutex.h:224
RecursiveMutex(const RecursiveMutex &)
Copy constructor is forbidden.
pthread_mutex_t * ptr() const
Return a pointer to the pthread mutex for use by a condition variable.
Definition worldmutex.h:244
void unlock() const
Free a mutex owned by this thread.
Definition worldmutex.h:234
bool try_lock() const
Try to acquire the mutex ... return true on success, false on failure.
Definition worldmutex.h:219
pthread_mutex_t mutex
Definition worldmutex.h:206
~RecursiveMutex()
Definition worldmutex.h:248
RecursiveMutex()
Make and initialize a mutex ... initial state is unlocked.
Definition worldmutex.cc:127
Mutex that is applied/released at start/end of a scope.
Definition worldmutex.h:258
const mutexT * mutex
Definition worldmutex.h:259
ScopedMutex(const mutexT &m)
Definition worldmutex.h:263
ScopedMutex(const mutexT *m)
Definition worldmutex.h:261
virtual ~ScopedMutex()
Definition worldmutex.h:265
Spinlock using pthread spinlock operations.
Definition worldmutex.h:272
void lock() const
Acquire the spinlock waiting if necessary.
Definition worldmutex.h:296
bool try_lock() const
Try to acquire the spinlock ... return true on success, false on failure.
Definition worldmutex.h:291
void operator=(const Spinlock &)
Assignment is forbidden.
Spinlock(int junk=0)
Make and initialize a spinlock ... initial state is unlocked.
Definition worldmutex.h:285
void unlock() const
Free a spinlock owned by this thread.
Definition worldmutex.h:306
Spinlock(const Spinlock &)
Copy constructor is forbidden.
virtual ~Spinlock()
Definition worldmutex.h:315
pthread_spinlock_t spinlock
Definition worldmutex.h:275
char * p(char *buf, const char *name, int k, int initial_level, double thresh, int order)
Definition derivatives.cc:72
Macros and tools pertaining to the configuration of MADNESS.
Defines madness::MadnessException for exception handling.
#define MADNESS_EXCEPTION(msg, value)
Macro for throwing a MADNESS exception.
Definition madness_exception.h:119
Definition potentialmanager.cc:41
void print_mutex_error(int error_number)
Definition worldmutex.cc:44
Mutex printmutex
Definition worldmutex.cc:146
Namespace for all elements and tools of MADNESS.
Definition DFConvergence.h:9
PthreadConditionVariable CONDITION_VARIABLE_TYPE
Definition worldmutex.h:713
WaitPolicy
wait policies supported by ConditionVariable/DQueue/ThreadPool
Definition worldmutex.h:511
bool try_two_locks(const Mutex &m1, const Mutex &m2)
Attempt to acquire two locks without blocking holding either one.
Definition worldmutex.h:642
Mutex SPINLOCK_TYPE
Definition worldmutex.h:714
static void myusleep(unsigned int us)
Sleep or spin for specified number of microseconds.
Definition timers.h:186
NDIM & f
Definition mra.h:2668
void cpu_relax()
Do nothing and especially do not touch memory.
Definition timers.h:166
Mutex SCALABLE_MUTEX_TYPE
Definition worldmutex.h:715
static const double b
Definition nonlinschro.cc:119
static const double m
Definition relops.cc:9
Wrappers around platform dependent timers and performance info.
#define MADNESS_MEMORY_STORE_BARRIER
Definition worldmutex.h:47
#define MADNESS_MEMORY_LOAD_BARRIER
Definition worldmutex.h:52