Index: chromecast/renderer/cast_content_renderer_client.cc |
diff --git a/chromecast/renderer/cast_content_renderer_client.cc b/chromecast/renderer/cast_content_renderer_client.cc |
index 6f9c67c84624b5712dbddd483aedb95f752ee677..f23336fd2f6a66b2e5e4ab407e301a3567a77798 100644 |
--- a/chromecast/renderer/cast_content_renderer_client.cc |
+++ b/chromecast/renderer/cast_content_renderer_client.cc |
@@ -27,6 +27,44 @@ namespace shell { |
namespace { |
+#if defined(ARCH_CPU_ARM_FAMILY) && !defined(OS_ANDROID) |
+// These memory thresholds are set for Chromecast. See the UMA histogram |
+// Platform.MeminfoMemFree when tuning. |
+const int kCriticalMinFreeMemMB = 24; |
+const int kModerateMinFreeMemMB = 48; |
+const int kPollingIntervalMS = 5000; |
lcwu1
2015/01/08 18:52:12
These numbers should be platform/product dependent
gunsch
2015/01/08 19:02:08
Done.
|
+ |
+void PlatformPollFreemem(void) { |
+ struct sysinfo sys; |
+ |
+ if (sysinfo(&sys) == -1) { |
+ LOG(ERROR) << "platform_poll_freemem(): sysinfo failed"; |
+ } else { |
+ int free_mem_mb = static_cast<int64_t>(sys.freeram) * |
+ sys.mem_unit / (1024 * 1024); |
+ |
+ if (free_mem_mb <= kModerateMinFreeMemMB) { |
+ if (free_mem_mb <= kCriticalMinFreeMemMB) { |
+ // Memory is getting really low, we need to do whatever we can to |
+ // prevent deadlocks and interfering with other processes. |
+ base::MemoryPressureListener::NotifyMemoryPressure( |
+ base::MemoryPressureListener::MEMORY_PRESSURE_CRITICAL); |
+ } else { |
+ // There is enough memory, but it is starting to get low. |
+ base::MemoryPressureListener::NotifyMemoryPressure( |
+ base::MemoryPressureListener::MEMORY_PRESSURE_MODERATE); |
+ } |
+ } |
+ } |
+ |
+ // Setup next poll. |
+ base::MessageLoopProxy::current()->PostDelayedTask( |
+ FROM_HERE, |
+ base::Bind(&PlatformPollFreemem), |
+ base::TimeDelta::FromMilliseconds(kPollingIntervalMS)); |
+} |
+#endif |
+ |
// Default background color to set for WebViews. WebColor is in ARGB format |
// though the comment of WebColor says it is in RGBA. |
const blink::WebColor kColorBlack = 0xFF000000; |
@@ -51,6 +89,10 @@ void CastContentRendererClient::RenderThreadStarted() { |
crypto::InitNSSSafely(); |
#endif |
+#if defined(ARCH_CPU_ARM_FAMILY) && !defined(OS_ANDROID) |
+ PlatformPollFreemem(); |
+#endif |
+ |
cast_observer_.reset(new CastRenderProcessObserver()); |
prescient_networking_dispatcher_.reset( |