sintonia/library/ecasound-2.7.2/kvutils/kvu_locks.h

73 lines
1.6 KiB
C++

// -*- mode: C++; -*-
#ifndef INCLUDED_KVU_LOCKS_H
#define INCLUDED_KVU_LOCKS_H
#include <pthread.h>
/**
* Atomic access to single integer values. Implementation
* may be based on direct atomic operations or traditional
* locking, depending on the underlying platform.
*
* On supported platforms, atomicity is guaranteed for
* both single- and multiprocessor concurrency. Ordering of
* concurrent reads and writes is however not guaranteed.
*
* Note! Atomic test-and-modify operations are not provided.
*/
class ATOMIC_INTEGER {
public:
/**
* Returns the stored integer value.
*
* Non-blocking.
*/
int get(void) const;
/**
* Sets the integer value to 'value'.
*
* Non-blocking. Atomic on most platforms.
*
* Atomic without limitations on most platforms. On some
* platforms (e.g. sparc64 and armv6), writes from multiple
* threads are unsafe.
*/
void set(int value);
ATOMIC_INTEGER(int value = 0);
~ATOMIC_INTEGER(void);
private:
volatile int value_rep;
ATOMIC_INTEGER& operator=(const ATOMIC_INTEGER& v);
ATOMIC_INTEGER(const ATOMIC_INTEGER& v);
};
/**
* A simple guarded lock wrapper for pthread_mutex_lock
* and pthread_mutex_unlock. Lock is acquired
* upon object creating and released during destruction.
*/
class KVU_GUARD_LOCK {
public:
KVU_GUARD_LOCK(pthread_mutex_t* lock_arg);
~KVU_GUARD_LOCK(void);
private:
pthread_mutex_t* lock_repp;
KVU_GUARD_LOCK(void) {}
KVU_GUARD_LOCK(const KVU_GUARD_LOCK&) {}
KVU_GUARD_LOCK& operator=(const KVU_GUARD_LOCK&) { return *this; }
};
#endif