summaryrefslogtreecommitdiffstats
path: root/WebKit
diff options
context:
space:
mode:
authorBen Murdoch <benm@google.com>2010-11-09 18:17:50 +0000
committerRussell Brenner <russellbrenner@google.com>2010-12-02 13:47:22 -0800
commite02b67f8cfa87b8e952bcae834e4f3d3937fcc98 (patch)
tree0971d84e250a354d4f741f0b42fc284d21da9ca0 /WebKit
parent1c7e3f51abb8590ac714e6ceeb9a5931365053ea (diff)
downloadexternal_webkit-e02b67f8cfa87b8e952bcae834e4f3d3937fcc98.zip
external_webkit-e02b67f8cfa87b8e952bcae834e4f3d3937fcc98.tar.gz
external_webkit-e02b67f8cfa87b8e952bcae834e4f3d3937fcc98.tar.bz2
Merge WebKit at r72274: Implement PlatformBridge memory management methods for WebKit change 71639
Get device class specific memory constraints for V8. V8 can be more efficient in terms of memory management but to do so needs to know about what resources are available to it. This varies device to device on Android so add implement the functions that the the PlatformBridge needs to query the relevant values from Java. MemoryUsage.cpp will compile for JSC, but needs tuning to report correct JSC stats. It's currently a non-issue, as this routine is only used with V8, at present. Requires a frameworks/base change: https://android-git.corp.google.com/g/#change,78690 Bug: 3075565 Requires a previously upstreamed webkit change: http://trac.webkit.org/changeset/71639 Change-Id: I25ff54b5c8e25f5de5380e0d43e56551587adc5d
Diffstat (limited to 'WebKit')
-rw-r--r--WebKit/Android.mk1
-rw-r--r--WebKit/android/WebCoreSupport/MemoryUsage.cpp81
-rw-r--r--WebKit/android/WebCoreSupport/MemoryUsage.h42
-rw-r--r--WebKit/android/WebCoreSupport/PlatformBridge.cpp21
-rw-r--r--WebKit/android/jni/WebViewCore.cpp8
5 files changed, 153 insertions, 0 deletions
diff --git a/WebKit/Android.mk b/WebKit/Android.mk
index 25e7be3..49fc13c 100644
--- a/WebKit/Android.mk
+++ b/WebKit/Android.mk
@@ -27,6 +27,7 @@ LOCAL_SRC_FILES := \
android/WebCoreSupport/FrameNetworkingContextAndroid.cpp \
android/WebCoreSupport/GeolocationPermissions.cpp \
android/WebCoreSupport/MediaPlayerPrivateAndroid.cpp \
+ android/WebCoreSupport/MemoryUsage.cpp \
android/WebCoreSupport/PlatformBridge.cpp \
android/WebCoreSupport/ResourceLoaderAndroid.cpp \
android/WebCoreSupport/UrlInterceptResponse.cpp \
diff --git a/WebKit/android/WebCoreSupport/MemoryUsage.cpp b/WebKit/android/WebCoreSupport/MemoryUsage.cpp
new file mode 100644
index 0000000..f799a18
--- /dev/null
+++ b/WebKit/android/WebCoreSupport/MemoryUsage.cpp
@@ -0,0 +1,81 @@
+/*
+ * Copyright 2010 The Android Open Source Project
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "config.h"
+#include "MemoryUsage.h"
+
+#include <malloc.h>
+#include <wtf/CurrentTime.h>
+
+#if USE(V8)
+#include <v8.h>
+#endif // USE(V8)
+
+using namespace WTF;
+
+class MemoryUsageCache {
+public:
+ MemoryUsageCache()
+ : m_cachedMemoryUsage(0)
+ , m_cacheTime(0)
+ {
+ }
+
+ int getCachedMemoryUsage(bool forceFresh);
+
+private:
+ unsigned m_cachedMemoryUsage;
+ double m_cacheTime;
+ static const int CACHE_VALIDITY_MS = 2000;
+};
+
+int MemoryUsageCache::getCachedMemoryUsage(bool forceFresh)
+{
+ if (!forceFresh && currentTimeMS() <= m_cacheTime + CACHE_VALIDITY_MS)
+ return m_cachedMemoryUsage;
+
+ struct mallinfo minfo = mallinfo();
+ m_cachedMemoryUsage = (minfo.hblkhd + minfo.arena) >> 20;
+
+#if USE(V8)
+ v8::HeapStatistics stat;
+ v8::V8::GetHeapStatistics(&stat);
+ unsigned v8Usage = stat.total_heap_size() >> 20;
+ m_cachedMemoryUsage += v8Usage;
+#endif // USE(V8)
+
+ m_cacheTime = currentTimeMS();
+ return m_cachedMemoryUsage;
+}
+
+int MemoryUsage::memoryUsageMb(bool forceFresh)
+{
+ static MemoryUsageCache cache;
+ return cache.getCachedMemoryUsage(forceFresh);
+}
+
+int MemoryUsage::m_lowMemoryUsageMb = 0;
+int MemoryUsage::m_highMemoryUsageMb = 0;
+
diff --git a/WebKit/android/WebCoreSupport/MemoryUsage.h b/WebKit/android/WebCoreSupport/MemoryUsage.h
new file mode 100644
index 0000000..899fd08
--- /dev/null
+++ b/WebKit/android/WebCoreSupport/MemoryUsage.h
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2010 The Android Open Source Project
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef MemoryUsage_h
+#define MemoryUsage_h
+
+class MemoryUsage {
+public:
+ static int memoryUsageMb(bool forceFresh);
+ static int lowMemoryUsageMb() { return m_lowMemoryUsageMb; }
+ static int highMemoryUsageMb() { return m_highMemoryUsageMb; }
+ static void setHighMemoryUsageMb(int highMemoryUsageMb) { m_highMemoryUsageMb = highMemoryUsageMb; }
+ static void setLowMemoryUsageMb(int lowMemoryUsageMb) { m_lowMemoryUsageMb = lowMemoryUsageMb; }
+
+private:
+ static int m_lowMemoryUsageMb;
+ static int m_highMemoryUsageMb;
+};
+
+#endif
diff --git a/WebKit/android/WebCoreSupport/PlatformBridge.cpp b/WebKit/android/WebCoreSupport/PlatformBridge.cpp
index cd5088b..89af00a 100644
--- a/WebKit/android/WebCoreSupport/PlatformBridge.cpp
+++ b/WebKit/android/WebCoreSupport/PlatformBridge.cpp
@@ -32,6 +32,7 @@
#include "FrameView.h"
#include "JavaSharedClient.h"
#include "KeyGeneratorClient.h"
+#include "MemoryUsage.h"
#include "PluginView.h"
#include "Settings.h"
#include "WebCookieJar.h"
@@ -189,6 +190,26 @@ void PlatformBridge::updateLayers(FrameView* frameView)
webViewCore->layersDraw();
}
+int PlatformBridge::lowMemoryUsageMB()
+{
+ return MemoryUsage::lowMemoryUsageMb();
+}
+
+int PlatformBridge::highMemoryUsageMB()
+{
+ return MemoryUsage::highMemoryUsageMb();
+}
+
+int PlatformBridge::memoryUsageMB()
+{
+ return MemoryUsage::memoryUsageMb(false);
+}
+
+int PlatformBridge::actualMemoryUsageMB()
+{
+ return MemoryUsage::memoryUsageMb(true);
+}
+
} // namespace WebCore
diff --git a/WebKit/android/jni/WebViewCore.cpp b/WebKit/android/jni/WebViewCore.cpp
index ed397d3..1fdc3d5 100644
--- a/WebKit/android/jni/WebViewCore.cpp
+++ b/WebKit/android/jni/WebViewCore.cpp
@@ -73,6 +73,7 @@
#include "HitTestRequest.h"
#include "HitTestResult.h"
#include "InlineTextBox.h"
+#include "MemoryUsage.h"
#include "Navigator.h"
#include "Node.h"
#include "NodeList.h"
@@ -237,6 +238,8 @@ struct WebViewCoreFields {
jfieldID m_viewportDensityDpi;
jfieldID m_webView;
jfieldID m_drawIsPaused;
+ jfieldID m_lowMemoryUsageMb;
+ jfieldID m_highMemoryUsageMb;
} gWebViewCoreFields;
// ----------------------------------------------------------------------------
@@ -393,6 +396,9 @@ WebViewCore::WebViewCore(JNIEnv* env, jobject javaWebViewCore, WebCore::Frame* m
reset(true);
+ MemoryUsage::setLowMemoryUsageMb(env->GetIntField(javaWebViewCore, gWebViewCoreFields.m_lowMemoryUsageMb));
+ MemoryUsage::setHighMemoryUsageMb(env->GetIntField(javaWebViewCore, gWebViewCoreFields.m_highMemoryUsageMb));
+
WebViewCore::addInstance(this);
#if USE(CHROME_NETWORK_STACK)
@@ -4169,6 +4175,8 @@ int registerWebViewCore(JNIEnv* env)
"mDrawIsPaused", "Z");
LOG_ASSERT(gWebViewCoreFields.m_drawIsPaused,
"Unable to find android/webkit/WebViewCore.mDrawIsPaused");
+ gWebViewCoreFields.m_lowMemoryUsageMb = env->GetFieldID(widget, "mLowMemoryUsageThresholdMb", "I");
+ gWebViewCoreFields.m_highMemoryUsageMb = env->GetFieldID(widget, "mHighMemoryUsageThresholdMb", "I");
gWebViewCoreStaticMethods.m_isSupportedMediaMimeType =
env->GetStaticMethodID(widget, "isSupportedMediaMimeType", "(Ljava/lang/String;)Z");