diff options
-rw-r--r-- | suspend/1.0/default/SystemSuspend.cpp | 22 | ||||
-rw-r--r-- | suspend/1.0/default/SystemSuspend.h | 1 |
2 files changed, 21 insertions, 2 deletions
diff --git a/suspend/1.0/default/SystemSuspend.cpp b/suspend/1.0/default/SystemSuspend.cpp index 81f3d45..2262c58 100644 --- a/suspend/1.0/default/SystemSuspend.cpp +++ b/suspend/1.0/default/SystemSuspend.cpp @@ -18,6 +18,7 @@ #include <android-base/file.h> #include <android-base/logging.h> +#include <android-base/stringprintf.h> #include <android-base/strings.h> #include <fcntl.h> #include <hidl/Status.h> @@ -70,8 +71,8 @@ static std::vector<std::string> readWakeupReasons(int fd) { std::string reasonlines; lseek(fd, 0, SEEK_SET); - if (!ReadFdToString(fd, &reasonlines)) { - LOG(ERROR) << "failed to read wakeup reasons"; + if (!ReadFdToString(fd, &reasonlines) || reasonlines.empty()) { + PLOG(ERROR) << "failed to read wakeup reasons"; // Return unknown wakeup reason if we fail to read return {kUnknownWakeup}; } @@ -236,6 +237,17 @@ void SystemSuspend::decSuspendCounter(const string& name) { } } +unique_fd SystemSuspend::reopenFileUsingFd(const int pid, const int fd, const int permission) { + string filePath = android::base::StringPrintf("/proc/%d/fd/%d", pid, fd); + + unique_fd tempFd{TEMP_FAILURE_RETRY(open(filePath.c_str(), permission))}; + if (tempFd < 0) { + PLOG(ERROR) << "SystemSuspend: Error opening file, using path: " << filePath; + return unique_fd(-1); + } + return tempFd; +} + void SystemSuspend::initAutosuspend() { std::thread autosuspendThread([this] { while (true) { @@ -268,6 +280,12 @@ void SystemSuspend::initAutosuspend() { updateSleepTime(success, suspendTime); std::vector<std::string> wakeupReasons = readWakeupReasons(mWakeupReasonsFd); + if (wakeupReasons == std::vector<std::string>({kUnknownWakeup})) { + LOG(INFO) << "Unknown/empty wakeup reason. Re-opening wakeup_reason file."; + + mWakeupReasonsFd = std::move(reopenFileUsingFd( + getCallingPid(), mWakeupReasonsFd.get(), O_CLOEXEC | O_RDONLY)); + } mWakeupList.update(wakeupReasons); mControlService->notifyWakeup(success, wakeupReasons); diff --git a/suspend/1.0/default/SystemSuspend.h b/suspend/1.0/default/SystemSuspend.h index 5632325..e5a0e84 100644 --- a/suspend/1.0/default/SystemSuspend.h +++ b/suspend/1.0/default/SystemSuspend.h @@ -114,6 +114,7 @@ class SystemSuspend : public ISystemSuspend { Result<SuspendStats> getSuspendStats(); void getSuspendInfo(SuspendInfo* info); std::chrono::milliseconds getSleepTime() const; + unique_fd reopenFileUsingFd(const int pid, const int fd, int permission); private: void initAutosuspend(); |