Introduce Lockable in FileLock 62/32762/2
authorAleksander Zdyb <a.zdyb@samsung.com>
Tue, 23 Dec 2014 12:54:32 +0000 (13:54 +0100)
committerAleksander Zdyb <a.zdyb@samsung.com>
Tue, 23 Dec 2014 14:57:31 +0000 (15:57 +0100)
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
src/common/lock/FileLock.h

index b8bd34a..98141f6 100644 (file)
@@ -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 */
index 53f048f..69311f0 100644 (file)
 
 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 */