blob: a20418412580e007e7fa17d87728e9011da4280f [file] [log] [blame]
/*
* 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, std::chrono::seconds& 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 = std::chrono::seconds { 60 };
#if PLATFORM(IOS)
if (memorySize >= 1024)
urlCacheMemoryCapacity = 16 * 1024 * 1024;
else
urlCacheMemoryCapacity = 8 * 1024 * 1024;
#else
// 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;
#endif
// 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