diff options
author | Badhri Jagan Sridharan <badhri@google.com> | 2021-09-01 23:58:49 +0000 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2021-09-01 23:58:49 +0000 |
commit | f58acde20291e576bc03da35bad8db8761f47e86 (patch) | |
tree | ba377dbd44998e908610fb5e6f3d7738effbc34f | |
parent | 7f9be8dbbd6415bc8c803e49536340b281c9c69e (diff) | |
parent | fda2597866f7e435f1e402035157dfc598081db4 (diff) | |
download | pixel-f58acde20291e576bc03da35bad8db8761f47e86.tar.gz |
Merge "libpixelusb: Cancel pending timer when port is cold" into sc-qpr1-dev
-rw-r--r-- | usb/UsbOverheatEvent.cpp | 39 | ||||
-rw-r--r-- | usb/include/pixelusb/UsbOverheatEvent.h | 8 |
2 files changed, 22 insertions, 25 deletions
diff --git a/usb/UsbOverheatEvent.cpp b/usb/UsbOverheatEvent.cpp index 408a0adf..a80f8b22 100644 --- a/usb/UsbOverheatEvent.cpp +++ b/usb/UsbOverheatEvent.cpp @@ -54,8 +54,6 @@ UsbOverheatEvent::UsbOverheatEvent(const ZoneInfo &monitored_zone, : monitored_zone_(monitored_zone), queried_zones_(queried_zones), monitor_interval_sec_(monitor_interval_sec), - lock_(), - cv_(), monitor_() { int fd = timerfd_create(CLOCK_BOOTTIME_ALARM, 0); if (fd < 0) { @@ -129,17 +127,12 @@ void *UsbOverheatEvent::monitorThread(void *param) { UsbOverheatEvent *overheatEvent = (UsbOverheatEvent *)param; struct epoll_event events[kEpollEvents]; struct itimerspec delay = itimerspec(); - std::unique_lock<std::mutex> lk(overheatEvent->lock_); - - delay.it_value.tv_sec = overheatEvent->monitor_interval_sec_; while (true) { uint64_t fired; float temperature = 0; string status; - overheatEvent->cv_.wait(lk, [] { return monitorTemperature; }); - for (vector<ZoneInfo>::size_type i = 0; i < overheatEvent->queried_zones_.size(); i++) { if (overheatEvent->getCurrentTemperature(overheatEvent->queried_zones_[i].name_, &temperature)) { @@ -154,10 +147,11 @@ void *UsbOverheatEvent::monitorThread(void *param) { } ALOGW("%s", status.c_str()); + delay.it_value.tv_sec = monitorTemperature ? overheatEvent->monitor_interval_sec_ : 0; int ret = timerfd_settime(overheatEvent->timer_fd_, 0, &delay, NULL); if (ret < 0) { - ALOGE("timerfd_settime failed. err:%d", errno); - return NULL; + ALOGE("timerfd_settime failed. err:%d tv_sec:%ld", errno, delay.it_value.tv_sec); + continue; } wakeLockRelease(); @@ -172,6 +166,7 @@ void *UsbOverheatEvent::monitorThread(void *param) { ALOGV("event=%u on fd=%d\n", events[i].events, events[i].data.fd); if (events[i].data.fd == overheatEvent->timer_fd_) { + ALOGI("Wake up caused by timer fd"); int numRead = read(overheatEvent->timer_fd_, &fired, sizeof(fired)); if (numRead != sizeof(fired)) { ALOGV("numRead incorrect"); @@ -180,6 +175,7 @@ void *UsbOverheatEvent::monitorThread(void *param) { ALOGV("Fired not set to 1"); } } else { + ALOGI("Wake up caused by event fd"); read(overheatEvent->event_fd_, &fired, sizeof(fired)); } } @@ -204,34 +200,37 @@ bool UsbOverheatEvent::registerListener() { return false; } -bool UsbOverheatEvent::startRecording() { - lock_guard<mutex> lock(lock_); +void UsbOverheatEvent::wakeupMonitor() { + // <flag> value does not have any significance here + uint64_t flag = 100; + + unsigned long ret = TEMP_FAILURE_RETRY(write(event_fd_, &flag, sizeof(flag))); + if (ret < 0) { + ALOGE("Error writing eventfd errno=%d", errno); + } +} +bool UsbOverheatEvent::startRecording() { + ALOGI("Start recording. monitorTemperature:%d", monitorTemperature ? 1 : 0); // Bail out if temperature was being monitored previously if (monitorTemperature) return true; wakeLockAcquire(); monitorTemperature = true; - cv_.notify_all(); + wakeupMonitor(); return true; } bool UsbOverheatEvent::stopRecording() { - // <flag> value does not have any significance here - uint64_t flag = 100; - unsigned long ret; - + ALOGI("Stop recording. monitorTemperature:%d", monitorTemperature ? 1 : 0); // Bail out if temperature was not being monitored previously if (!monitorTemperature) return true; wakeLockRelease(); monitorTemperature = false; - ret = TEMP_FAILURE_RETRY(write(event_fd_, &flag, sizeof(flag))); - if (ret < 0) { - ALOGE("Error writing eventfd errno=%d", errno); - } + wakeupMonitor(); return true; } diff --git a/usb/include/pixelusb/UsbOverheatEvent.h b/usb/include/pixelusb/UsbOverheatEvent.h index ac8b6b0a..de8cc240 100644 --- a/usb/include/pixelusb/UsbOverheatEvent.h +++ b/usb/include/pixelusb/UsbOverheatEvent.h @@ -86,7 +86,7 @@ class UsbOverheatEvent : public IServiceNotification, public IThermalChangedCall private: // To wake up thread to record max temperature unique_fd timer_fd_; - // Pools on timer_fd_ + // Polls on timer_fd_ & event_fd. Thread waits here when port is cold. unique_fd epoll_fd_; // To wake up the thread when waiting on TimerFd unique_fd event_fd_; @@ -99,10 +99,6 @@ class UsbOverheatEvent : public IServiceNotification, public IThermalChangedCall vector<ZoneInfo> queried_zones_; // Sampling interval for monitoring the temperature int monitor_interval_sec_; - // protects the CV. - std::mutex lock_; - // Thread waits here when mRecordMaxTemp is false - std::condition_variable cv_; // Thread object that executes the ep monitoring logic unique_ptr<thread> monitor_; // Maximum overheat temperature recorded @@ -113,6 +109,8 @@ class UsbOverheatEvent : public IServiceNotification, public IThermalChangedCall static void *monitorThread(void *param); // Register service notification listener bool registerListener(); + // Helper function to wakeup monitor thread + void wakeupMonitor(); // Thermal ServiceNotification listener Return<void> onRegistration(const hidl_string & /*fully_qualified_name*/, const hidl_string & /*instance_name*/, |