| // Copyright 2017 The Chromium OS Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "hammerd/process_lock.h" |
| |
| #include <sys/file.h> |
| |
| #include <utility> |
| |
| #include <base/logging.h> |
| |
| namespace hammerd { |
| |
| ProcessLock::ProcessLock(const base::FilePath& lock_file) |
| : lock_file_(lock_file) {} |
| |
| ProcessLock::~ProcessLock() { |
| Release(); |
| } |
| |
| bool ProcessLock::IsLocked() const { |
| return fd_.is_valid(); |
| } |
| |
| bool ProcessLock::Acquire() { |
| if (IsLocked()) { |
| return true; |
| } |
| |
| base::ScopedFD fd( |
| open(lock_file_.value().c_str(), O_CREAT | O_RDWR | O_CLOEXEC, 0666)); |
| if (!fd.is_valid()) { |
| PLOG(ERROR) << "Failed to open the file"; |
| return false; |
| } |
| if (flock(fd.get(), LOCK_EX | LOCK_NB) != 0) { |
| PLOG(ERROR) << "Failed to lock the file"; |
| return false; |
| } |
| LOG(INFO) << "Locked the file"; |
| fd_ = std::move(fd); |
| return true; |
| } |
| |
| bool ProcessLock::Release() { |
| if (!IsLocked()) { |
| return true; |
| } |
| |
| if (flock(fd_.get(), LOCK_UN | LOCK_NB) != 0) { |
| PLOG(ERROR) << "Failed to unlock the file"; |
| return false; |
| } |
| LOG(INFO) << "Unlocked the file"; |
| fd_.reset(); |
| return true; |
| } |
| } // namespace hammerd |