Commit 069842d7 authored by Alexei Filippov's avatar Alexei Filippov Committed by Commit Bot

DevTools: Add memory dump provider to SharedFileWatcher

The provider reports number of files currently being monitored by
the watcher. This is needed to confirm there's no memory leak in the
SharedFileWatcher.

BUG=810155

Change-Id: I560a4ce8c7a297cd60162c528e8c76c37f3a47ff
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1539017Reviewed-by: default avatarssid <ssid@chromium.org>
Reviewed-by: default avatarDmitry Gozman <dgozman@chromium.org>
Commit-Queue: Alexei Filippov <alph@chromium.org>
Cr-Commit-Position: refs/heads/master@{#644387}
parent 324086b5
...@@ -27,9 +27,10 @@ const char* const kDumpProviderWhitelist[] = { ...@@ -27,9 +27,10 @@ const char* const kDumpProviderWhitelist[] = {
"BlinkObjectCounters", "BlinkObjectCounters",
"BlobStorageContext", "BlobStorageContext",
"ClientDiscardableSharedMemoryManager", "ClientDiscardableSharedMemoryManager",
"DevTools",
"DiscardableSharedMemoryManager",
"DOMStorage", "DOMStorage",
"DownloadService", "DownloadService",
"DiscardableSharedMemoryManager",
"gpu::BufferManager", "gpu::BufferManager",
"gpu::RenderbufferManager", "gpu::RenderbufferManager",
"gpu::TextureManager", "gpu::TextureManager",
...@@ -84,6 +85,7 @@ const char* const kAllocatorDumpNameWhitelist[] = { ...@@ -84,6 +85,7 @@ const char* const kAllocatorDumpNameWhitelist[] = {
"blink_objects/UACSSResource", "blink_objects/UACSSResource",
"blink_objects/ResourceFetcher", "blink_objects/ResourceFetcher",
"components/download/controller_0x?", "components/download/controller_0x?",
"devtools/file_watcher_path_count",
"discardable", "discardable",
"discardable/child_0x?", "discardable/child_0x?",
"extensions/value_store/Extensions.Database.Open.Settings/0x?", "extensions/value_store/Extensions.Database.Open.Settings/0x?",
......
...@@ -19,6 +19,8 @@ ...@@ -19,6 +19,8 @@
#include "base/sequenced_task_runner.h" #include "base/sequenced_task_runner.h"
#include "base/task/lazy_task_runner.h" #include "base/task/lazy_task_runner.h"
#include "base/threading/sequenced_task_runner_handle.h" #include "base/threading/sequenced_task_runner_handle.h"
#include "base/trace_event/memory_dump_manager.h"
#include "base/trace_event/memory_dump_provider.h"
#include "content/public/browser/browser_thread.h" #include "content/public/browser/browser_thread.h"
using content::BrowserThread; using content::BrowserThread;
...@@ -28,8 +30,9 @@ static constexpr int kDefaultThrottleTimeout = 200; ...@@ -28,8 +30,9 @@ static constexpr int kDefaultThrottleTimeout = 200;
// DevToolsFileWatcher::SharedFileWatcher -------------------------------------- // DevToolsFileWatcher::SharedFileWatcher --------------------------------------
class DevToolsFileWatcher::SharedFileWatcher : class DevToolsFileWatcher::SharedFileWatcher
public base::RefCounted<SharedFileWatcher> { : public base::RefCounted<SharedFileWatcher>,
public base::trace_event::MemoryDumpProvider {
public: public:
SharedFileWatcher(); SharedFileWatcher();
...@@ -38,10 +41,14 @@ class DevToolsFileWatcher::SharedFileWatcher : ...@@ -38,10 +41,14 @@ class DevToolsFileWatcher::SharedFileWatcher :
void AddWatch(const base::FilePath& path); void AddWatch(const base::FilePath& path);
void RemoveWatch(const base::FilePath& path); void RemoveWatch(const base::FilePath& path);
// base::trace_event::MemoryDumpProvider implementation:
bool OnMemoryDump(
const base::trace_event::MemoryDumpArgs& args,
base::trace_event::ProcessMemoryDump* process_memory_dump) override;
private: private:
friend class base::RefCounted< friend class base::RefCounted<SharedFileWatcher>;
DevToolsFileWatcher::SharedFileWatcher>; ~SharedFileWatcher() override;
~SharedFileWatcher();
using FilePathTimesMap = std::unordered_map<base::FilePath, base::Time>; using FilePathTimesMap = std::unordered_map<base::FilePath, base::Time>;
FilePathTimesMap GetModificationTimes(const base::FilePath& path); FilePathTimesMap GetModificationTimes(const base::FilePath& path);
...@@ -61,13 +68,31 @@ DevToolsFileWatcher::SharedFileWatcher::SharedFileWatcher() ...@@ -61,13 +68,31 @@ DevToolsFileWatcher::SharedFileWatcher::SharedFileWatcher()
: last_dispatch_cost_( : last_dispatch_cost_(
base::TimeDelta::FromMilliseconds(kDefaultThrottleTimeout)) { base::TimeDelta::FromMilliseconds(kDefaultThrottleTimeout)) {
DevToolsFileWatcher::s_shared_watcher_ = this; DevToolsFileWatcher::s_shared_watcher_ = this;
base::trace_event::MemoryDumpManager::GetInstance()
->RegisterDumpProviderWithSequencedTaskRunner(
this, "DevTools", base::SequencedTaskRunnerHandle::Get(),
base::trace_event::MemoryDumpProvider::Options());
} }
DevToolsFileWatcher::SharedFileWatcher::~SharedFileWatcher() { DevToolsFileWatcher::SharedFileWatcher::~SharedFileWatcher() {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
base::trace_event::MemoryDumpManager::GetInstance()->UnregisterDumpProvider(
this);
DevToolsFileWatcher::s_shared_watcher_ = nullptr; DevToolsFileWatcher::s_shared_watcher_ = nullptr;
} }
bool DevToolsFileWatcher::SharedFileWatcher::OnMemoryDump(
const base::trace_event::MemoryDumpArgs& args,
base::trace_event::ProcessMemoryDump* process_memory_dump) {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
auto* dump = process_memory_dump->CreateAllocatorDump(
"devtools/file_watcher_path_count");
dump->AddScalar(base::trace_event::MemoryAllocatorDump::kNameObjectCount,
base::trace_event::MemoryAllocatorDump::kUnitsObjects,
file_path_times_.size());
return true;
}
void DevToolsFileWatcher::SharedFileWatcher::AddListener( void DevToolsFileWatcher::SharedFileWatcher::AddListener(
DevToolsFileWatcher* watcher) { DevToolsFileWatcher* watcher) {
DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
...@@ -191,14 +216,12 @@ base::SequencedTaskRunner* impl_task_runner() { ...@@ -191,14 +216,12 @@ base::SequencedTaskRunner* impl_task_runner() {
base::MayBlock(), base::TaskPriority::BEST_EFFORT}; base::MayBlock(), base::TaskPriority::BEST_EFFORT};
static base::LazySequencedTaskRunner s_file_task_runner = static base::LazySequencedTaskRunner s_file_task_runner =
LAZY_SEQUENCED_TASK_RUNNER_INITIALIZER(kImplTaskTraits); LAZY_SEQUENCED_TASK_RUNNER_INITIALIZER(kImplTaskTraits);
return s_file_task_runner.Get().get(); return s_file_task_runner.Get().get();
} }
} // namespace } // namespace
// static // static
DevToolsFileWatcher::SharedFileWatcher* DevToolsFileWatcher::SharedFileWatcher* DevToolsFileWatcher::s_shared_watcher_;
DevToolsFileWatcher::s_shared_watcher_ = nullptr;
// static // static
void DevToolsFileWatcher::Deleter::operator()(const DevToolsFileWatcher* ptr) { void DevToolsFileWatcher::Deleter::operator()(const DevToolsFileWatcher* ptr) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment