#pragma once
#ifndef __AUTO_LOCK__
#define __AUTO_LOCK__
#include <assert.h>
#include "AutoDefs.h"
#include "auto_impl_utilities.h"
namespace Auto {
class SpinLock {
spin_lock_t *_lock;
public:
SpinLock(spin_lock_t *lock) : _lock(lock) { spin_lock(_lock); }
~SpinLock() { spin_unlock(_lock); }
};
class ConditionBarrier {
spin_lock_t *_lock;
public:
ConditionBarrier(bool volatile *condition, spin_lock_t *lock) : _lock(NULL) {
if (*condition) {
spin_lock(lock);
if (!*condition) {
spin_unlock(lock);
} else {
_lock = lock;
}
}
}
operator int() { return _lock != NULL; }
~ConditionBarrier() { if (_lock) spin_unlock(_lock); }
};
class UnconditionalBarrier {
bool volatile *_condition;
spin_lock_t *_lock;
public:
UnconditionalBarrier(bool volatile *condition, spin_lock_t *lock) : _condition(condition), _lock(lock) {
spin_lock(lock);
}
operator int() { return (*_condition != false); }
~UnconditionalBarrier() { spin_unlock(_lock); }
};
class Mutex {
pthread_mutex_t *_mutex;
public:
Mutex(pthread_mutex_t *mutex) : _mutex(mutex) { if (_mutex) pthread_mutex_lock(_mutex); }
~Mutex() { if (_mutex) pthread_mutex_unlock(_mutex); }
};
};
#endif // __AUTO_LOCK__