diff options
-rw-r--r-- | WebKit/Android.mk | 1 | ||||
-rw-r--r-- | WebKit/android/WebCoreSupport/MemoryUsage.cpp | 81 | ||||
-rw-r--r-- | WebKit/android/WebCoreSupport/MemoryUsage.h | 42 | ||||
-rw-r--r-- | WebKit/android/WebCoreSupport/PlatformBridge.cpp | 21 | ||||
-rw-r--r-- | WebKit/android/jni/WebViewCore.cpp | 8 |
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"); |