|  | /* | 
|  | * Copyright (C) 2012 Apple Inc. All rights reserved. | 
|  | * | 
|  | * Redistribution and use in source and binary forms, with or without | 
|  | * modification, are permitted provided that the following conditions | 
|  | * are met: | 
|  | * 1. Redistributions of source code must retain the above copyright | 
|  | *    notice, this list of conditions and the following disclaimer. | 
|  | * 2. Redistributions in binary form must reproduce the above copyright | 
|  | *    notice, this list of conditions and the following disclaimer in the | 
|  | *    documentation and/or other materials provided with the distribution. | 
|  | * | 
|  | * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' | 
|  | * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, | 
|  | * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR | 
|  | * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS | 
|  | * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | 
|  | * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | 
|  | * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | 
|  | * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | 
|  | * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | 
|  | * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF | 
|  | * THE POSSIBILITY OF SUCH DAMAGE. | 
|  | */ | 
|  |  | 
|  | #include "config.h" | 
|  | #include "CacheModel.h" | 
|  |  | 
|  | #include <algorithm> | 
|  |  | 
|  | namespace WebKit { | 
|  |  | 
|  | void calculateCacheSizes(CacheModel cacheModel, uint64_t memorySize, uint64_t diskFreeSize, | 
|  | unsigned& cacheTotalCapacity, unsigned& cacheMinDeadCapacity, unsigned& cacheMaxDeadCapacity, double& deadDecodedDataDeletionInterval, | 
|  | unsigned& pageCacheCapacity, unsigned long& urlCacheMemoryCapacity, unsigned long& urlCacheDiskCapacity) | 
|  | { | 
|  | switch (cacheModel) { | 
|  | case CacheModelDocumentViewer: { | 
|  | // Page cache capacity (in pages) | 
|  | pageCacheCapacity = 0; | 
|  |  | 
|  | // Object cache capacities (in bytes) | 
|  | if (memorySize >= 2048) | 
|  | cacheTotalCapacity = 96 * 1024 * 1024; | 
|  | else if (memorySize >= 1536) | 
|  | cacheTotalCapacity = 64 * 1024 * 1024; | 
|  | else if (memorySize >= 1024) | 
|  | cacheTotalCapacity = 32 * 1024 * 1024; | 
|  | else if (memorySize >= 512) | 
|  | cacheTotalCapacity = 16 * 1024 * 1024; | 
|  |  | 
|  | cacheMinDeadCapacity = 0; | 
|  | cacheMaxDeadCapacity = 0; | 
|  |  | 
|  | // Foundation memory cache capacity (in bytes) | 
|  | urlCacheMemoryCapacity = 0; | 
|  |  | 
|  | // Foundation disk cache capacity (in bytes) | 
|  | urlCacheDiskCapacity = 0; | 
|  |  | 
|  | break; | 
|  | } | 
|  | case CacheModelDocumentBrowser: { | 
|  | // Page cache capacity (in pages) | 
|  | if (memorySize >= 1024) | 
|  | pageCacheCapacity = 3; | 
|  | else if (memorySize >= 512) | 
|  | pageCacheCapacity = 2; | 
|  | else if (memorySize >= 256) | 
|  | pageCacheCapacity = 1; | 
|  | else | 
|  | pageCacheCapacity = 0; | 
|  |  | 
|  | // Object cache capacities (in bytes) | 
|  | if (memorySize >= 2048) | 
|  | cacheTotalCapacity = 96 * 1024 * 1024; | 
|  | else if (memorySize >= 1536) | 
|  | cacheTotalCapacity = 64 * 1024 * 1024; | 
|  | else if (memorySize >= 1024) | 
|  | cacheTotalCapacity = 32 * 1024 * 1024; | 
|  | else if (memorySize >= 512) | 
|  | cacheTotalCapacity = 16 * 1024 * 1024; | 
|  |  | 
|  | cacheMinDeadCapacity = cacheTotalCapacity / 8; | 
|  | cacheMaxDeadCapacity = cacheTotalCapacity / 4; | 
|  |  | 
|  | // Foundation memory cache capacity (in bytes) | 
|  | if (memorySize >= 2048) | 
|  | urlCacheMemoryCapacity = 4 * 1024 * 1024; | 
|  | else if (memorySize >= 1024) | 
|  | urlCacheMemoryCapacity = 2 * 1024 * 1024; | 
|  | else if (memorySize >= 512) | 
|  | urlCacheMemoryCapacity = 1 * 1024 * 1024; | 
|  | else | 
|  | urlCacheMemoryCapacity =      512 * 1024; | 
|  |  | 
|  | // Foundation disk cache capacity (in bytes) | 
|  | if (diskFreeSize >= 16384) | 
|  | urlCacheDiskCapacity = 50 * 1024 * 1024; | 
|  | else if (diskFreeSize >= 8192) | 
|  | urlCacheDiskCapacity = 40 * 1024 * 1024; | 
|  | else if (diskFreeSize >= 4096) | 
|  | urlCacheDiskCapacity = 30 * 1024 * 1024; | 
|  | else | 
|  | urlCacheDiskCapacity = 20 * 1024 * 1024; | 
|  |  | 
|  | break; | 
|  | } | 
|  | case CacheModelPrimaryWebBrowser: { | 
|  | // Page cache capacity (in pages) | 
|  | if (memorySize >= 1024) | 
|  | pageCacheCapacity = 3; | 
|  | else if (memorySize >= 512) | 
|  | pageCacheCapacity = 2; | 
|  | else if (memorySize >= 256) | 
|  | pageCacheCapacity = 1; | 
|  | else | 
|  | pageCacheCapacity = 0; | 
|  |  | 
|  | // Object cache capacities (in bytes) | 
|  | // (Testing indicates that value / MB depends heavily on content and | 
|  | // browsing pattern. Even growth above 128MB can have substantial | 
|  | // value / MB for some content / browsing patterns.) | 
|  | if (memorySize >= 2048) | 
|  | cacheTotalCapacity = 128 * 1024 * 1024; | 
|  | else if (memorySize >= 1536) | 
|  | cacheTotalCapacity = 96 * 1024 * 1024; | 
|  | else if (memorySize >= 1024) | 
|  | cacheTotalCapacity = 64 * 1024 * 1024; | 
|  | else if (memorySize >= 512) | 
|  | cacheTotalCapacity = 32 * 1024 * 1024; | 
|  |  | 
|  | cacheMinDeadCapacity = cacheTotalCapacity / 4; | 
|  | cacheMaxDeadCapacity = cacheTotalCapacity / 2; | 
|  |  | 
|  | // This code is here to avoid a PLT regression. We can remove it if we | 
|  | // can prove that the overall system gain would justify the regression. | 
|  | cacheMaxDeadCapacity = std::max(24u, cacheMaxDeadCapacity); | 
|  |  | 
|  | deadDecodedDataDeletionInterval = 60; | 
|  |  | 
|  | // Foundation memory cache capacity (in bytes) | 
|  | // (These values are small because WebCore does most caching itself.) | 
|  | if (memorySize >= 1024) | 
|  | urlCacheMemoryCapacity = 4 * 1024 * 1024; | 
|  | else if (memorySize >= 512) | 
|  | urlCacheMemoryCapacity = 2 * 1024 * 1024; | 
|  | else if (memorySize >= 256) | 
|  | urlCacheMemoryCapacity = 1 * 1024 * 1024; | 
|  | else | 
|  | urlCacheMemoryCapacity =      512 * 1024; | 
|  |  | 
|  | // Foundation disk cache capacity (in bytes) | 
|  | if (diskFreeSize >= 16384) | 
|  | urlCacheDiskCapacity = 175 * 1024 * 1024; | 
|  | else if (diskFreeSize >= 8192) | 
|  | urlCacheDiskCapacity = 150 * 1024 * 1024; | 
|  | else if (diskFreeSize >= 4096) | 
|  | urlCacheDiskCapacity = 125 * 1024 * 1024; | 
|  | else if (diskFreeSize >= 2048) | 
|  | urlCacheDiskCapacity = 100 * 1024 * 1024; | 
|  | else if (diskFreeSize >= 1024) | 
|  | urlCacheDiskCapacity = 75 * 1024 * 1024; | 
|  | else | 
|  | urlCacheDiskCapacity = 50 * 1024 * 1024; | 
|  |  | 
|  | break; | 
|  | } | 
|  | default: | 
|  | ASSERT_NOT_REACHED(); | 
|  | }; | 
|  | } | 
|  |  | 
|  | } // namespace WebKit |