Log number of bytes reclaimed at each step of memory pressure relief.
[WebKit-https.git] / Source / WebCore / platform / MemoryPressureHandler.cpp
1 /*
2  * Copyright (C) 2011, 2014 Apple Inc. All Rights Reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #include "config.h"
27 #include "MemoryPressureHandler.h"
28
29 #include "CSSValuePool.h"
30 #include "Document.h"
31 #include "Font.h"
32 #include "FontCache.h"
33 #include "GCController.h"
34 #include "MemoryCache.h"
35 #include "Page.h"
36 #include "PageCache.h"
37 #include "ScrollingThread.h"
38 #include "StorageThread.h"
39 #include "WorkerThread.h"
40 #include <wtf/CurrentTime.h>
41 #include <wtf/FastMalloc.h>
42 #include <wtf/Functional.h>
43 #include <wtf/StdLibExtras.h>
44
45 namespace WebCore {
46
47 MemoryPressureHandler& memoryPressureHandler()
48 {
49     DEPRECATED_DEFINE_STATIC_LOCAL(MemoryPressureHandler, staticMemoryPressureHandler, ());
50     return staticMemoryPressureHandler;
51 }
52
53 MemoryPressureHandler::MemoryPressureHandler() 
54     : m_installed(false)
55     , m_lastRespondTime(0)
56     , m_lowMemoryHandler(releaseMemory)
57     , m_underMemoryPressure(false)
58 #if PLATFORM(IOS)
59     // FIXME: Can we share more of this with OpenSource?
60     , m_memoryPressureReason(MemoryPressureReasonNone)
61     , m_clearPressureOnMemoryRelease(true)
62     , m_releaseMemoryBlock(0)
63     , m_observer(0)
64 #endif
65 {
66 }
67
68 void MemoryPressureHandler::releaseMemory(bool critical)
69 {
70     {
71         ReliefLogger log("Empty the PageCache");
72         int savedPageCacheCapacity = pageCache()->capacity();
73         pageCache()->setCapacity(0);
74         pageCache()->setCapacity(savedPageCacheCapacity);
75     }
76
77     {
78         ReliefLogger log("Purge inactive FontData");
79         fontCache()->purgeInactiveFontData();
80     }
81
82     {
83         ReliefLogger log("Prune MemoryCache");
84         memoryCache()->pruneToPercentage(0);
85     }
86
87     {
88         ReliefLogger log("Drain CSSValuePool");
89         cssValuePool().drain();
90     }
91
92     {
93         ReliefLogger log("Clear WidthCaches");
94         clearWidthCaches();
95     }
96
97     {
98         ReliefLogger log("Discard StyleResolvers");
99         for (auto* document : Document::allDocuments())
100             document->clearStyleResolver();
101     }
102
103     {
104         ReliefLogger log("Discard all JIT-compiled code");
105         gcController().discardAllCompiledCode();
106     }
107
108     platformReleaseMemory(critical);
109
110     {
111         ReliefLogger log("Release free FastMalloc memory");
112         // FastMalloc has lock-free thread specific caches that can only be cleared from the thread itself.
113         StorageThread::releaseFastMallocFreeMemoryInAllThreads();
114         WorkerThread::releaseFastMallocFreeMemoryInAllThreads();
115 #if ENABLE(ASYNC_SCROLLING)
116         ScrollingThread::dispatch(bind(WTF::releaseFastMallocFreeMemory));
117 #endif
118         WTF::releaseFastMallocFreeMemory();
119     }
120 }
121
122 #if !PLATFORM(COCOA)
123 void MemoryPressureHandler::install() { }
124 void MemoryPressureHandler::uninstall() { }
125 void MemoryPressureHandler::holdOff(unsigned) { }
126 void MemoryPressureHandler::respondToMemoryPressure() { }
127 void MemoryPressureHandler::platformReleaseMemory(bool) { }
128 void MemoryPressureHandler::ReliefLogger::platformLog() { }
129 size_t MemoryPressureHandler::ReliefLogger::platformMemoryUsage() { return 0; }
130 #endif
131
132 } // namespace WebCore