Commit fff8929b authored by Mukund Sivaraman's avatar Mukund Sivaraman
Browse files

[2198] Stop using direct lock methods on Mutex inside InterprocessSyncFile

parent ecef170d
......@@ -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);
}
......
......@@ -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
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment