]> git.ipfire.org Git - thirdparty/kea.git/commitdiff
[2198] Stop using direct lock methods on Mutex inside InterprocessSyncFile
authorMukund Sivaraman <muks@isc.org>
Sun, 14 Oct 2012 16:52:35 +0000 (22:22 +0530)
committerMukund Sivaraman <muks@isc.org>
Sun, 21 Oct 2012 23:44:37 +0000 (05:14 +0530)
src/lib/util/interprocess_sync_file.cc
src/lib/util/interprocess_sync_file.h

index 71d328735b3522905f589c00f385721d2d1dcdd7..b406e6e01c90754573e39fb0a23aa7063ac84256 100644 (file)
@@ -34,7 +34,6 @@ namespace util {
 namespace { // unnamed namespace
 
 typedef std::map<std::string, boost::weak_ptr<Mutex> > SyncMap;
-typedef boost::shared_ptr<Mutex> MutexPtr;
 
 Mutex sync_map_mutex;
 SyncMap sync_map;
@@ -69,9 +68,11 @@ InterprocessSyncFile::~InterprocessSyncFile() {
 
     Mutex::Locker locker(sync_map_mutex);
 
-    // Unref the shared mutex first.
+    // Unref the shared mutex.
+    locker_.reset();
     mutex_.reset();
 
+    // Remove name from the map if it is unused anymore.
     SyncMap::iterator it = sync_map.find(task_name_);
     assert(it != sync_map.end());
 
@@ -139,20 +140,15 @@ InterprocessSyncFile::lock() {
     }
 
     // First grab the thread lock...
-    mutex_->lock();
+    LockerPtr locker(new Mutex::Locker(*mutex_));
 
     // ... then the file lock.
-    try {
-        if (do_lock(F_SETLKW, F_WRLCK)) {
-            is_locked_ = true;
-            return (true);
-        }
-    } catch (...) {
-        mutex_->unlock();
-        throw;
+    if (do_lock(F_SETLKW, F_WRLCK)) {
+        is_locked_ = true;
+        locker_ = locker;
+        return (true);
     }
 
-    mutex_->unlock();
     return (false);
 }
 
@@ -163,23 +159,20 @@ InterprocessSyncFile::tryLock() {
     }
 
     // First grab the thread lock...
-    if (!mutex_->tryLock()) {
+    LockerPtr locker;
+    try {
+        locker.reset(new Mutex::Locker(*mutex_, false));
+    } catch (const Mutex::Locker::AlreadyLocked&) {
         return (false);
     }
 
     // ... then the file lock.
-    try {
-        // ... then the file lock.
-        if (do_lock(F_SETLK, F_WRLCK)) {
-            is_locked_ = true;
-            return (true);
-        }
-    } catch (...) {
-        mutex_->unlock();
-        throw;
+    if (do_lock(F_SETLK, F_WRLCK)) {
+        is_locked_ = true;
+        locker_ = locker;
+        return (true);
     }
 
-    mutex_->unlock();
     return (false);
 }
 
@@ -194,7 +187,7 @@ InterprocessSyncFile::unlock() {
         return (false);
     }
 
-    mutex_->unlock();
+    locker_.reset();
     is_locked_ = false;
     return (true);
 }
index 6eb8f95e1c73f8a46c3e1204729fe93af02feb25..b0fe81f906ca17f8d3af7c282dc505d4fcf33914 100644 (file)
@@ -86,7 +86,9 @@ private:
     int fd_; ///< The descriptor for the open file
 
     typedef boost::shared_ptr<isc::util::thread::Mutex> MutexPtr;
-    MutexPtr mutex_; ///< A mutex for mutual exclusion among threads
+    typedef boost::shared_ptr<isc::util::thread::Mutex::Locker> LockerPtr;
+    MutexPtr mutex_;   ///< A mutex for mutual exclusion among threads
+    LockerPtr locker_; ///< A locker on mutex_
 };
 
 } // namespace util