memgraph/database/locking/record_lock.hpp
2015-12-07 18:45:44 +01:00

43 lines
746 B
C++

#pragma once
#include "threading/sync/futex.hpp"
#include "lock_status.hpp"
#include "mvcc/id.hpp"
class RecordLock
{
static constexpr struct timespec timeout {20, 0};
static constexpr Id INVALID = Id();
public:
void lock()
{
mutex.lock(&timeout);
}
LockStatus lock(const Id& id)
{
if(mutex.try_lock())
return owner = id, LockStatus::Acquired;
if(owner == id)
return LockStatus::AlreadyHeld;
return mutex.lock(&timeout), LockStatus::Acquired;
}
void unlock()
{
owner = INVALID;
mutex.unlock();
}
private:
Futex mutex;
Id owner;
};
constexpr struct timespec RecordLock::timeout;
constexpr Id RecordLock::INVALID;