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
31namespace WebKit {
32
33void calculateCacheSizes(CacheModel cacheModel, uint64_t memorySize, uint64_t diskFreeSize,
34    unsigned& cacheTotalCapacity, unsigned& cacheMinDeadCapacity, unsigned& cacheMaxDeadCapacity, double& 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 = 60;
141
142        // Foundation memory cache capacity (in bytes)
143        // (These values are small because WebCore does most caching itself.)
144        if (memorySize >= 1024)
145            urlCacheMemoryCapacity = 4 * 1024 * 1024;
146        else if (memorySize >= 512)
147            urlCacheMemoryCapacity = 2 * 1024 * 1024;
148        else if (memorySize >= 256)
149            urlCacheMemoryCapacity = 1 * 1024 * 1024;
150        else
151            urlCacheMemoryCapacity =      512 * 1024;
152
153        // Foundation disk cache capacity (in bytes)
154        if (diskFreeSize >= 16384)
155            urlCacheDiskCapacity = 175 * 1024 * 1024;
156        else if (diskFreeSize >= 8192)
157            urlCacheDiskCapacity = 150 * 1024 * 1024;
158        else if (diskFreeSize >= 4096)
159            urlCacheDiskCapacity = 125 * 1024 * 1024;
160        else if (diskFreeSize >= 2048)
161            urlCacheDiskCapacity = 100 * 1024 * 1024;
162        else if (diskFreeSize >= 1024)
163            urlCacheDiskCapacity = 75 * 1024 * 1024;
164        else
165            urlCacheDiskCapacity = 50 * 1024 * 1024;
166
167        break;
168    }
169    default:
170        ASSERT_NOT_REACHED();
171    };
172}
173
174} // namespace WebKit
175