Files
textmate/Shared/include/oak/lock.h
Allan Odgaard 9894969e67 Initial commit
2012-08-09 16:25:56 +02:00

42 lines
1.2 KiB
C++

#ifndef LOCK_H_SDS5VGYK
#define LOCK_H_SDS5VGYK
namespace oak
{
struct lock_t
{
lock_t (pthread_mutex_t& mutex) : mutex(&mutex), is_locked(false) { lock(); }
lock_t (lock_t const& rhs) : mutex(rhs.mutex) { lock(); }
lock_t& operator= (lock_t const& rhs) { unlock(); mutex = rhs.mutex; is_locked = false; lock(); return *this; }
~lock_t () { unlock(); }
void lock () { if(!is_locked) pthread_mutex_lock(mutex); is_locked = true; }
void unlock () { if(is_locked) pthread_mutex_unlock(mutex); is_locked = false; }
private:
pthread_mutex_t* mutex;
bool is_locked;
};
struct mutex_t
{
mutex_t ()
{
pthread_mutexattr_t attr;
pthread_mutexattr_init(&attr);
pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);
pthread_mutex_init(&mutex, &attr);
pthread_mutexattr_destroy(&attr);
}
~mutex_t () { pthread_mutex_destroy(&mutex); }
lock_t const operator() () const { return lock_t(mutex); }
private:
mutable pthread_mutex_t mutex;
};
} /* oak */
#endif /* end of include guard: LOCK_H_SDS5VGYK */