| // Copyright 2018 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. |
| |
| #ifndef CHAPS_SYSTEM_SHUTDOWN_BLOCKER_H_ |
| #define CHAPS_SYSTEM_SHUTDOWN_BLOCKER_H_ |
| |
| #include <set> |
| |
| #include <base/files/file_path.h> |
| #include <base/threading/thread_task_runner_handle.h> |
| #include <base/time/time.h> |
| |
| namespace chaps { |
| |
| // Blocks shutdown signal from powerd by creating a lock file for blocked slots |
| // in /run/lock/power_override. |
| class SystemShutdownBlocker { |
| public: |
| // |origin_thread_task_runner| should be chapsd's origin thread task runner. |
| explicit SystemShutdownBlocker( |
| const scoped_refptr<base::SingleThreadTaskRunner>& |
| origin_thread_task_runner); |
| |
| // Unblocks all remaining blocked slots (see |blocked_slots_|). |
| ~SystemShutdownBlocker(); |
| |
| // Posts an immediate call to |PerformBlock()| and a delayed call to |
| // |PerformUnblock()| on the |origin_thread_task_runner_|. |
| void Block(int slot_id, base::TimeDelta fallback_timeout); |
| |
| // Posts an immediate call to |PerformUnblock()| on the |
| // |origin_thread_task_runner_|. |
| void Unblock(int slot_id); |
| |
| private: |
| // Creates a lock file readable by powerd with chapsd's PID and marks the slot |
| // as blocked in |blocked_slots|. |
| void PerformBlock(int slot_id); |
| |
| // Calls |PerformUnblock()| and removes the block mark if the slot is marked |
| // as blocked in |blocked_slots_|, otherwise no-op. |
| void PerformUnblockIfBlocked(int slot_id); |
| |
| // Deletes the lock file and returns whether or not the slot is unblocked |
| // (i.e. lock file removed). |
| bool PerformUnblock(int slot_id); |
| |
| // Gets the corresponding lock file path for |slot_id| |
| // (/run/lock/power_override/chapsd_token_init_slot_<<<SLOT_ID>>>.lock). |
| base::FilePath GetPowerdLockFilePath(int slot_id) const; |
| |
| scoped_refptr<base::SingleThreadTaskRunner> origin_thread_task_runner_; |
| std::set<int> blocked_slots_; |
| |
| DISALLOW_COPY_AND_ASSIGN(SystemShutdownBlocker); |
| }; |
| |
| } // namespace chaps |
| |
| #endif // CHAPS_SYSTEM_SHUTDOWN_BLOCKER_H_ |