Index: third_party/WebKit/Source/platform/exported/Platform.cpp |
diff --git a/third_party/WebKit/Source/platform/exported/Platform.cpp b/third_party/WebKit/Source/platform/exported/Platform.cpp |
index ff29254cbb7c40ab8966bea597129860fddbff5a..ce2ee9d202e8078b99db9eaf7949406afc9c4839 100644 |
--- a/third_party/WebKit/Source/platform/exported/Platform.cpp |
+++ b/third_party/WebKit/Source/platform/exported/Platform.cpp |
@@ -30,19 +30,24 @@ |
#include "base/thread_task_runner_handle.h" |
#include "base/trace_event/memory_dump_manager.h" |
+#include "platform/Histogram.h" |
#include "platform/PartitionAllocMemoryDumpProvider.h" |
#include "platform/fonts/FontCacheMemoryDumpProvider.h" |
#include "platform/graphics/CompositorFactory.h" |
+#include "platform/heap/GCTaskRunner.h" |
#include "platform/web_memory_dump_provider_adapter.h" |
#include "public/platform/Platform.h" |
+#include "public/platform/WebPrerenderingSupport.h" |
#include "wtf/HashMap.h" |
#include "wtf/OwnPtr.h" |
namespace blink { |
-static Platform* s_platform = 0; |
+static Platform* s_platform = nullptr; |
using ProviderToAdapterMap = HashMap<WebMemoryDumpProvider*, OwnPtr<WebMemoryDumpProviderAdapter>>; |
+static GCTaskRunner* s_gcTaskRunner = nullptr; |
+ |
namespace { |
ProviderToAdapterMap& memoryDumpProviders() |
@@ -58,14 +63,42 @@ Platform::Platform() |
{ |
} |
+static void maxObservedSizeFunction(size_t sizeInMB) |
+{ |
+ const size_t supportedMaxSizeInMB = 4 * 1024; |
+ if (sizeInMB >= supportedMaxSizeInMB) |
+ sizeInMB = supportedMaxSizeInMB - 1; |
+ |
+ // Send a UseCounter only when we see the highest memory usage |
+ // we've ever seen. |
+ DEFINE_STATIC_LOCAL(EnumerationHistogram, committedSizeHistogram, ("PartitionAlloc.CommittedSize", supportedMaxSizeInMB)); |
+ committedSizeHistogram.count(sizeInMB); |
+} |
+ |
+static void callOnMainThreadFunction(WTF::MainThreadFunction function, void* context) |
+{ |
+ Platform::current()->mainThread()->getWebTaskRunner()->postTask(BLINK_FROM_HERE, threadSafeBind(function, AllowCrossThreadAccess(context))); |
+} |
+ |
void Platform::initialize(Platform* platform) |
{ |
+ ASSERT(!s_platform); |
ASSERT(platform); |
s_platform = platform; |
s_platform->m_mainThread = platform->currentThread(); |
+ WTF::Partitions::initialize(maxObservedSizeFunction); |
+ WTF::initialize(); |
+ WTF::initializeMainThread(callOnMainThreadFunction); |
+ |
+ Heap::init(); |
+ |
+ ThreadState::attachMainThread(); |
+ |
// TODO(ssid): remove this check after fixing crbug.com/486782. |
if (s_platform->m_mainThread) { |
+ ASSERT(!s_gcTaskRunner); |
+ s_gcTaskRunner = new GCTaskRunner(s_platform->m_mainThread); |
s_platform->registerMemoryDumpProvider(PartitionAllocMemoryDumpProvider::instance(), "PartitionAlloc"); |
s_platform->registerMemoryDumpProvider(FontCacheMemoryDumpProvider::instance(), "FontCaches"); |
} |
@@ -75,13 +108,27 @@ void Platform::initialize(Platform* platform) |
void Platform::shutdown() |
{ |
+ ASSERT(isMainThread()); |
CompositorFactory::shutdown(); |
if (s_platform->m_mainThread) { |
s_platform->unregisterMemoryDumpProvider(FontCacheMemoryDumpProvider::instance()); |
s_platform->unregisterMemoryDumpProvider(PartitionAllocMemoryDumpProvider::instance()); |
+ ASSERT(s_gcTaskRunner); |
+ delete s_gcTaskRunner; |
+ s_gcTaskRunner = nullptr; |
} |
+ // Detach the main thread before starting the shutdown sequence |
+ // so that the main thread won't get involved in a GC during the shutdown. |
+ ThreadState::detachMainThread(); |
+ |
+ Heap::shutdown(); |
+ |
+ WTF::shutdown(); |
+ WebPrerenderingSupport::shutdown(); |
+ WTF::Partitions::shutdown(); |
+ |
s_platform->m_mainThread = nullptr; |
s_platform = nullptr; |
} |