Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(158)

Unified Diff: components/framelet/browser/framelet_memory_tracker.cc

Issue 1602663003: Framelet Prototype 2016 using Mojo IPC Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebased. Disabled oilpan Created 4 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: components/framelet/browser/framelet_memory_tracker.cc
diff --git a/components/framelet/browser/framelet_memory_tracker.cc b/components/framelet/browser/framelet_memory_tracker.cc
new file mode 100644
index 0000000000000000000000000000000000000000..a426528d0aef164ccac218a6ff7b1616b34b7f59
--- /dev/null
+++ b/components/framelet/browser/framelet_memory_tracker.cc
@@ -0,0 +1,103 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "components/framelet/browser/framelet_memory_tracker.h"
+
+#include "components/framelet/browser/framelet_memory_tracker_client.h"
+#include "components/framelet/common/framelet_constants.h"
+#include "components/framelet/common/framelet_messages.h"
+#include "content/public/browser/browser_context.h"
+#include "content/public/browser/render_view_host.h"
+#include "content/public/common/child_process_host.h"
+
+namespace framelet {
+
+namespace {
+
+bool SendMessageToClient(const FrameletMemoryTracker::ClientID& client_id,
+ IPC::Message* message) {
+ content::RenderViewHost* rvh = content::RenderViewHost::FromID(
+ client_id.render_process_id(), client_id.routing_id());
+ if (!rvh) {
+ delete message;
+ return false;
+ }
+ return rvh->Send(message);
+}
+
+} // namespace
+
+FrameletMemoryTracker::ClientID::ClientID()
+ : render_process_id_(content::ChildProcessHost::kInvalidUniqueID),
+ routing_id_(MSG_ROUTING_NONE) {}
+
+FrameletMemoryTracker::ClientID::ClientID(int render_process_id, int routing_id)
+ : render_process_id_(render_process_id), routing_id_(routing_id) {}
+
+FrameletMemoryTracker::ClientID::~ClientID() {}
+
+bool FrameletMemoryTracker::ClientID::operator<(const ClientID& other) const {
+ return std::tie(render_process_id_, routing_id_) <
+ std::tie(other.render_process_id_, other.routing_id_);
+}
+
+bool FrameletMemoryTracker::ClientID::operator==(const ClientID& other) const {
+ return (render_process_id_ == other.render_process_id_) &&
+ (routing_id_ == other.routing_id_);
+}
+
+// static
+FrameletMemoryTracker* FrameletMemoryTracker::FromBrowserContext(
+ content::BrowserContext* context) {
+ FrameletMemoryTracker* tracker = static_cast<FrameletMemoryTracker*>(
+ context->GetUserData(kFrameletMemoryTrackerKeyName));
+ if (!tracker) {
+ tracker = new FrameletMemoryTracker();
+ context->SetUserData(kFrameletMemoryTrackerKeyName, tracker);
+ }
+ return tracker;
+}
+
+void FrameletMemoryTracker::ReportHeapSize(const ClientID& client_id,
+ int heap_size) {
+ DCHECK_LT(0u, acks_pending_.count(client_id));
+ // The client might have been removed since we issued the heap size request.
+ if (!clients_.count(client_id))
+ return;
+ clients_[client_id]->ReportHeapSize(heap_size);
+ acks_pending_.erase(client_id);
+}
+
+void FrameletMemoryTracker::AddClient(const ClientID& client_id,
+ FrameletMemoryTrackerClient* client) {
+ clients_.insert(std::make_pair(client_id, client));
+ if (!timer_.IsRunning()) {
+ timer_.Start(FROM_HERE, base::TimeDelta::FromSeconds(1), this,
+ &FrameletMemoryTracker::OnElapsedTime);
+ }
+}
+
+void FrameletMemoryTracker::RemoveClient(const ClientID& client_id) {
+ clients_.erase(client_id);
+ if (clients_.empty() && timer_.IsRunning())
+ timer_.Stop();
+}
+
+FrameletMemoryTracker::FrameletMemoryTracker() {}
+
+FrameletMemoryTracker::~FrameletMemoryTracker() {}
+
+void FrameletMemoryTracker::OnElapsedTime() {
+ for (auto& kv : clients_) {
+ const ClientID& client_id = kv.first;
+ if (acks_pending_.count(client_id))
+ continue;
+ if (SendMessageToClient(client_id, new ChromeGuestViewMsg_RequestHeapSize(
+ client_id.routing_id()))) {
+ acks_pending_.insert(client_id);
+ }
+ }
+}
+
+} // namespace framelet
« no previous file with comments | « components/framelet/browser/framelet_memory_tracker.h ('k') | components/framelet/browser/framelet_memory_tracker_client.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698