From d514cd59397d07540b44bf8bc925947cee545e5b Mon Sep 17 00:00:00 2001 From: Aleksander Zdyb Date: Tue, 23 Dec 2014 13:54:32 +0100 Subject: [PATCH] Introduce Lockable in FileLock FileLock now operates on lockable object instead of a file path and internal file descriptor. Lockable is an abstraction of file descriptor. Change-Id: Ie17905a4455492956e5162d90add488ca6f3080c --- src/common/lock/FileLock.cpp | 21 ++++++++++++++++----- src/common/lock/FileLock.h | 18 ++++++++++++++---- 2 files changed, 30 insertions(+), 9 deletions(-) diff --git a/src/common/lock/FileLock.cpp b/src/common/lock/FileLock.cpp index b8bd34a..98141f6 100644 --- a/src/common/lock/FileLock.cpp +++ b/src/common/lock/FileLock.cpp @@ -36,8 +36,8 @@ namespace Cynara { -FileLock::FileLock(const std::string &lockFilename) : m_lockFilename(lockFilename) { - m_fd = ::open(m_lockFilename.c_str(), O_RDONLY); +Lockable::Lockable(const std::string &lockFilename) { + m_fd = TEMP_FAILURE_RETRY(::open(lockFilename.c_str(), O_RDONLY)); if (m_fd < 0) { LOGE("Could not open lock file <%s>", lockFilename.c_str()); @@ -47,12 +47,18 @@ FileLock::FileLock(const std::string &lockFilename) : m_lockFilename(lockFilenam LOGD("File lock file opened"); } -FileLock::~FileLock() { +Lockable::~Lockable() { ::close(m_fd); } +FileLock::FileLock(Lockable &lockable) : m_lockable(lockable) {} + +FileLock::~FileLock() { + unlock(); +} + bool FileLock::tryLock(void) { - int lock = TEMP_FAILURE_RETRY(::flock(m_fd, LOCK_EX | LOCK_NB)); + int lock = TEMP_FAILURE_RETRY(::flock(m_lockable.m_fd, LOCK_EX | LOCK_NB)); if (lock == 0) { LOGI("File lock acquired"); @@ -66,7 +72,7 @@ bool FileLock::tryLock(void) { } void FileLock::lock(void) { - int lock = TEMP_FAILURE_RETRY(::flock(m_fd, LOCK_EX)); + int lock = TEMP_FAILURE_RETRY(::flock(m_lockable.m_fd, LOCK_EX)); if (lock == -1) throw FileLockAcquiringException(errno); @@ -74,4 +80,9 @@ void FileLock::lock(void) { LOGI("File lock acquired"); } +void FileLock::unlock(void) { + LOGI("Releasing file lock"); + TEMP_FAILURE_RETRY(::flock(m_lockable.m_fd, LOCK_UN)); +} + } /* namespace Cynara */ diff --git a/src/common/lock/FileLock.h b/src/common/lock/FileLock.h index 53f048f..69311f0 100644 --- a/src/common/lock/FileLock.h +++ b/src/common/lock/FileLock.h @@ -27,16 +27,26 @@ namespace Cynara { +class FileLock; + +class Lockable { + friend FileLock; +public: + explicit Lockable(const std::string &lockFilename); + ~Lockable(); +private: + int m_fd; +}; + class FileLock { public: - explicit FileLock(const std::string &lockFilename); + explicit FileLock(Lockable &lockable); ~FileLock(); bool tryLock(void); void lock(void); - + void unlock(void); private: - std::string m_lockFilename; - int m_fd; + Lockable &m_lockable; }; } /* namespace Cynara */ -- 2.7.4