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