Change DeferrableOneShotTimer to use std::function instead of being a class template
[WebKit-https.git] / Source / WebKit2 / Shared / CacheModel.cpp
1 /*
2  * Copyright (C) 2012 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. AND ITS CONTRIBUTORS ``AS IS''
14  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
15  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
17  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23  * THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #include "config.h"
27 #include "CacheModel.h"
28
29 #include <algorithm>
30
31 namespace WebKit {
32
33 void calculateCacheSizes(CacheModel cacheModel, uint64_t memorySize, uint64_t diskFreeSize,
34     unsigned& cacheTotalCapacity, unsigned& cacheMinDeadCapacity, unsigned& cacheMaxDeadCapacity, std::chrono::seconds& deadDecodedDataDeletionInterval,
35     unsigned& pageCacheCapacity, unsigned long& urlCacheMemoryCapacity, unsigned long& urlCacheDiskCapacity)
36 {
37     switch (cacheModel) {
38     case CacheModelDocumentViewer: {
39         // Page cache capacity (in pages)
40         pageCacheCapacity = 0;
41
42         // Object cache capacities (in bytes)
43         if (memorySize >= 2048)
44             cacheTotalCapacity = 96 * 1024 * 1024;
45         else if (memorySize >= 1536)
46             cacheTotalCapacity = 64 * 1024 * 1024;
47         else if (memorySize >= 1024)
48             cacheTotalCapacity = 32 * 1024 * 1024;
49         else if (memorySize >= 512)
50             cacheTotalCapacity = 16 * 1024 * 1024;
51
52         cacheMinDeadCapacity = 0;
53         cacheMaxDeadCapacity = 0;
54
55         // Foundation memory cache capacity (in bytes)
56         urlCacheMemoryCapacity = 0;
57
58         // Foundation disk cache capacity (in bytes)
59         urlCacheDiskCapacity = 0;
60
61         break;
62     }
63     case CacheModelDocumentBrowser: {
64         // Page cache capacity (in pages)
65         if (memorySize >= 1024)
66             pageCacheCapacity = 3;
67         else if (memorySize >= 512)
68             pageCacheCapacity = 2;
69         else if (memorySize >= 256)
70             pageCacheCapacity = 1;
71         else
72             pageCacheCapacity = 0;
73
74         // Object cache capacities (in bytes)
75         if (memorySize >= 2048)
76             cacheTotalCapacity = 96 * 1024 * 1024;
77         else if (memorySize >= 1536)
78             cacheTotalCapacity = 64 * 1024 * 1024;
79         else if (memorySize >= 1024)
80             cacheTotalCapacity = 32 * 1024 * 1024;
81         else if (memorySize >= 512)
82             cacheTotalCapacity = 16 * 1024 * 1024;
83
84         cacheMinDeadCapacity = cacheTotalCapacity / 8;
85         cacheMaxDeadCapacity = cacheTotalCapacity / 4;
86
87         // Foundation memory cache capacity (in bytes)
88         if (memorySize >= 2048)
89             urlCacheMemoryCapacity = 4 * 1024 * 1024;
90         else if (memorySize >= 1024)
91             urlCacheMemoryCapacity = 2 * 1024 * 1024;
92         else if (memorySize >= 512)
93             urlCacheMemoryCapacity = 1 * 1024 * 1024;
94         else
95             urlCacheMemoryCapacity =      512 * 1024; 
96
97         // Foundation disk cache capacity (in bytes)
98         if (diskFreeSize >= 16384)
99             urlCacheDiskCapacity = 50 * 1024 * 1024;
100         else if (diskFreeSize >= 8192)
101             urlCacheDiskCapacity = 40 * 1024 * 1024;
102         else if (diskFreeSize >= 4096)
103             urlCacheDiskCapacity = 30 * 1024 * 1024;
104         else
105             urlCacheDiskCapacity = 20 * 1024 * 1024;
106
107         break;
108     }
109     case CacheModelPrimaryWebBrowser: {
110         // Page cache capacity (in pages)
111         if (memorySize >= 1024)
112             pageCacheCapacity = 3;
113         else if (memorySize >= 512)
114             pageCacheCapacity = 2;
115         else if (memorySize >= 256)
116             pageCacheCapacity = 1;
117         else
118             pageCacheCapacity = 0;
119
120         // Object cache capacities (in bytes)
121         // (Testing indicates that value / MB depends heavily on content and
122         // browsing pattern. Even growth above 128MB can have substantial 
123         // value / MB for some content / browsing patterns.)
124         if (memorySize >= 2048)
125             cacheTotalCapacity = 128 * 1024 * 1024;
126         else if (memorySize >= 1536)
127             cacheTotalCapacity = 96 * 1024 * 1024;
128         else if (memorySize >= 1024)
129             cacheTotalCapacity = 64 * 1024 * 1024;
130         else if (memorySize >= 512)
131             cacheTotalCapacity = 32 * 1024 * 1024;
132
133         cacheMinDeadCapacity = cacheTotalCapacity / 4;
134         cacheMaxDeadCapacity = cacheTotalCapacity / 2;
135
136         // This code is here to avoid a PLT regression. We can remove it if we
137         // can prove that the overall system gain would justify the regression.
138         cacheMaxDeadCapacity = std::max(24u, cacheMaxDeadCapacity);
139
140         deadDecodedDataDeletionInterval = std::chrono::seconds { 60 };
141
142 #if PLATFORM(IOS)
143         if (memorySize >= 1024)
144             urlCacheMemoryCapacity = 16 * 1024 * 1024;
145         else
146             urlCacheMemoryCapacity = 8 * 1024 * 1024;
147 #else
148         // Foundation memory cache capacity (in bytes)
149         // (These values are small because WebCore does most caching itself.)
150         if (memorySize >= 1024)
151             urlCacheMemoryCapacity = 4 * 1024 * 1024;
152         else if (memorySize >= 512)
153             urlCacheMemoryCapacity = 2 * 1024 * 1024;
154         else if (memorySize >= 256)
155             urlCacheMemoryCapacity = 1 * 1024 * 1024;
156         else
157             urlCacheMemoryCapacity =      512 * 1024;
158 #endif
159
160         // Foundation disk cache capacity (in bytes)
161         if (diskFreeSize >= 16384)
162             urlCacheDiskCapacity = 175 * 1024 * 1024;
163         else if (diskFreeSize >= 8192)
164             urlCacheDiskCapacity = 150 * 1024 * 1024;
165         else if (diskFreeSize >= 4096)
166             urlCacheDiskCapacity = 125 * 1024 * 1024;
167         else if (diskFreeSize >= 2048)
168             urlCacheDiskCapacity = 100 * 1024 * 1024;
169         else if (diskFreeSize >= 1024)
170             urlCacheDiskCapacity = 75 * 1024 * 1024;
171         else
172             urlCacheDiskCapacity = 50 * 1024 * 1024;
173
174         break;
175     }
176     default:
177         ASSERT_NOT_REACHED();
178     };
179 }
180
181 } // namespace WebKit