You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
103 lines
3.9 KiB
103 lines
3.9 KiB
From e18f110107399803dd070088c601f9a5540a2a3f Mon Sep 17 00:00:00 2001
|
|
From: Hidehiko Abe <hidehiko@chromium.org>
|
|
Date: Thu, 3 Oct 2019 02:04:53 +0900
|
|
Subject: [PATCH] components/timers: fix fd leak in AlarmTimer
|
|
|
|
This is fixed upstream but will take a while to roll back
|
|
into Chrome OS.
|
|
|
|
BUG=chromium:984593
|
|
TEST=enable/disable wifi repeatedly and see that there is no
|
|
growth of open timerfds
|
|
|
|
Change-Id: If2af8f8ddf6b9dc31cda36fe5f5454ca0c5819de
|
|
---
|
|
components/timers/alarm_timer_chromeos.cc | 8 ++++----
|
|
components/timers/alarm_timer_chromeos.h | 15 ++++++++-------
|
|
2 files changed, 12 insertions(+), 11 deletions(-)
|
|
|
|
diff --git a/components/timers/alarm_timer_chromeos.cc b/components/timers/alarm_timer_chromeos.cc
|
|
index 0b43134..f14d889 100644
|
|
--- a/components/timers/alarm_timer_chromeos.cc
|
|
+++ b/components/timers/alarm_timer_chromeos.cc
|
|
@@ -80,7 +80,7 @@ void SimpleAlarmTimer::Reset() {
|
|
alarm_time.it_value.tv_nsec =
|
|
(delay.InMicroseconds() % base::Time::kMicrosecondsPerSecond) *
|
|
base::Time::kNanosecondsPerMicrosecond;
|
|
- if (timerfd_settime(alarm_fd_, 0, &alarm_time, NULL) < 0)
|
|
+ if (timerfd_settime(alarm_fd_.get(), 0, &alarm_time, NULL) < 0)
|
|
PLOG(ERROR) << "Error while setting alarm time. Timer will not fire";
|
|
|
|
// The timer is running.
|
|
@@ -97,7 +97,7 @@ void SimpleAlarmTimer::Reset() {
|
|
base::debug::TaskAnnotator().WillQueueTask("SimpleAlarmTimer::Reset",
|
|
pending_task_.get());
|
|
alarm_fd_watcher_ = base::FileDescriptorWatcher::WatchReadable(
|
|
- alarm_fd_,
|
|
+ alarm_fd_.get(),
|
|
base::BindRepeating(&SimpleAlarmTimer::OnAlarmFdReadableWithoutBlocking,
|
|
weak_factory_.GetWeakPtr()));
|
|
}
|
|
@@ -109,7 +109,7 @@ void SimpleAlarmTimer::OnAlarmFdReadableWithoutBlocking() {
|
|
|
|
// Read from |alarm_fd_| to ack the event.
|
|
char val[sizeof(uint64_t)];
|
|
- if (!base::ReadFromFD(alarm_fd_, val, sizeof(uint64_t)))
|
|
+ if (!base::ReadFromFD(alarm_fd_.get(), val, sizeof(uint64_t)))
|
|
PLOG(DFATAL) << "Unable to read from timer file descriptor.";
|
|
|
|
OnTimerFired();
|
|
@@ -137,7 +137,7 @@ void SimpleAlarmTimer::OnTimerFired() {
|
|
}
|
|
|
|
bool SimpleAlarmTimer::CanWakeFromSuspend() const {
|
|
- return alarm_fd_ != -1;
|
|
+ return alarm_fd_.is_valid();
|
|
}
|
|
|
|
} // namespace timers
|
|
diff --git a/components/timers/alarm_timer_chromeos.h b/components/timers/alarm_timer_chromeos.h
|
|
index 1ff689e..100ba81 100644
|
|
--- a/components/timers/alarm_timer_chromeos.h
|
|
+++ b/components/timers/alarm_timer_chromeos.h
|
|
@@ -8,6 +8,7 @@
|
|
#include <memory>
|
|
|
|
#include "base/files/file_descriptor_watcher_posix.h"
|
|
+#include "base/files/scoped_file.h"
|
|
#include "base/macros.h"
|
|
#include "base/memory/scoped_refptr.h"
|
|
#include "base/memory/weak_ptr.h"
|
|
@@ -43,6 +44,12 @@ class SimpleAlarmTimer : public base::RetainingOneShotTimer {
|
|
void Stop() override;
|
|
void Reset() override;
|
|
|
|
+ // Tracks whether the timer has the ability to wake the system up from
|
|
+ // suspend. This is a runtime check because we won't know if the system
|
|
+ // supports being woken up from suspend until the constructor actually tries
|
|
+ // to set it up.
|
|
+ bool CanWakeFromSuspend() const;
|
|
+
|
|
private:
|
|
// Called when |alarm_fd_| is readable without blocking. Reads data from
|
|
// |alarm_fd_| and calls OnTimerFired().
|
|
@@ -51,14 +58,8 @@ class SimpleAlarmTimer : public base::RetainingOneShotTimer {
|
|
// Called when the timer fires. Runs the callback.
|
|
void OnTimerFired();
|
|
|
|
- // Tracks whether the timer has the ability to wake the system up from
|
|
- // suspend. This is a runtime check because we won't know if the system
|
|
- // supports being woken up from suspend until the constructor actually tries
|
|
- // to set it up.
|
|
- bool CanWakeFromSuspend() const;
|
|
-
|
|
// Timer file descriptor.
|
|
- const int alarm_fd_;
|
|
+ base::ScopedFD alarm_fd_;
|
|
|
|
// Watches |alarm_fd_|.
|
|
std::unique_ptr<base::FileDescriptorWatcher::Controller> alarm_fd_watcher_;
|
|
--
|
|
2.23.0.581.g78d2f28ef7-goog
|
|
|