summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBadhri Jagan Sridharan <badhri@google.com>2021-09-01 23:58:49 +0000
committerAndroid (Google) Code Review <android-gerrit@google.com>2021-09-01 23:58:49 +0000
commitf58acde20291e576bc03da35bad8db8761f47e86 (patch)
treeba377dbd44998e908610fb5e6f3d7738effbc34f
parent7f9be8dbbd6415bc8c803e49536340b281c9c69e (diff)
parentfda2597866f7e435f1e402035157dfc598081db4 (diff)
downloadpixel-f58acde20291e576bc03da35bad8db8761f47e86.tar.gz
Merge "libpixelusb: Cancel pending timer when port is cold" into sc-qpr1-dev
-rw-r--r--usb/UsbOverheatEvent.cpp39
-rw-r--r--usb/include/pixelusb/UsbOverheatEvent.h8
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*/,