Chromium Code Reviews| Index: components/arc/metrics/oom_kills_monitor.h |
| diff --git a/components/arc/metrics/oom_kills_monitor.h b/components/arc/metrics/oom_kills_monitor.h |
| index c6cf7995ae835043f084b1eb1d3aa3e34734be0a..25ad43e774f3a8cc76ab66065608ffcab995cce7 100644 |
| --- a/components/arc/metrics/oom_kills_monitor.h |
| +++ b/components/arc/metrics/oom_kills_monitor.h |
| @@ -5,33 +5,54 @@ |
| #ifndef COMPONENTS_ARC_METRICS_OOM_KILLS_MONITOR_H_ |
| #define COMPONENTS_ARC_METRICS_OOM_KILLS_MONITOR_H_ |
| +#include "base/lazy_instance.h" |
| #include "base/macros.h" |
| #include "base/memory/ref_counted.h" |
| -#include "base/threading/sequenced_worker_pool.h" |
| +#include "base/threading/thread.h" |
| namespace arc { |
| // Traces kernel OOM kill events and lowmemorykiller (if enabled) events. |
| // |
| // OomKillsMonitor listens to kernel messages for both OOM kills and |
| -// lowmemorykiller kills, then reports to UMA. |
| +// lowmemorykiller kills, then reports to UMA. It uses a non-joinable thread |
| +// in order to avoid blocking shutdown. |
| // |
| // Note: There should be only one OomKillsMonitor instance globally at any given |
| // time, otherwise UMA would receive duplicate events. |
| -class OomKillsMonitor { |
| +class OomKillsMonitor : public base::Thread { |
| public: |
| - OomKillsMonitor(); |
| - ~OomKillsMonitor(); |
| + // A handle representing the OomKillsMonitor's lifetime (the monitor itself |
| + // can't be destroyed per being a non-joinable Thread). |
| + class OomKillsMonitorHandle { |
| + public: |
| + // Constructs a handle that will flag |outer| as shutting down on |
| + // destruction. |
| + explicit OomKillsMonitorHandle(OomKillsMonitor* outer); |
| + |
| + ~OomKillsMonitorHandle(); |
| + |
| + private: |
| + OomKillsMonitor* const outer_; |
|
Luis Héctor Chávez
2016/08/01 15:48:14
Now that I think of it, doesn't this also need a f
gab
2016/08/04 22:42:36
Inner classes have access to their Outer class' pr
|
| + } |
| - void Start(); |
| - void Stop(); |
| + // The instance has to be leaked on shutdown per being a non-joinable Thread. |
| + ~OomKillsMonitor() = delete; |
| + |
| + // Instantiates the OomKillsMonitor instance and starts it. This can only |
| + // be invoked once per process. |
| + static OomKillsMonitorHandle StartMonitoring(); |
| private: |
| - // Keeps a reference to worker_pool_ in case |this| is deleted in |
| - // shutdown process while this thread returns from a blocking read. |
| - static void Run(scoped_refptr<base::SequencedWorkerPool> worker_pool); |
| + friend struct base::internal::LeakyLazyInstanceTraits; |
| + OomKillsMonitor(); |
| + |
| + void Run() override; |
| - scoped_refptr<base::SequencedWorkerPool> worker_pool_; |
| + // A flag set when OomKillsMonitor is shutdown so that its thread can poll |
| + // it and attempt to wind down from that point (to avoid unecessary work, not |
| + // because it blocks shutdown). |
| + base::AtomicFlag is_shutting_down_; |
| DISALLOW_COPY_AND_ASSIGN(OomKillsMonitor); |
| }; |