11a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis/* 21a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis ** Copyright 2011, The Android Open Source Project 31a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis ** 41a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis ** Licensed under the Apache License, Version 2.0 (the "License"); 51a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis ** you may not use this file except in compliance with the License. 61a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis ** You may obtain a copy of the License at 71a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis ** 81a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis ** http://www.apache.org/licenses/LICENSE-2.0 91a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis ** 101a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis ** Unless required by applicable law or agreed to in writing, software 111a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis ** distributed under the License is distributed on an "AS IS" BASIS, 121a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 131a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis ** See the License for the specific language governing permissions and 141a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis ** limitations under the License. 151a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis */ 161a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis 171a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis#ifndef ANDROID_BLOB_CACHE_H 181a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis#define ANDROID_BLOB_CACHE_H 191a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis 201a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis#include <stddef.h> 211a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis 227451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis#include <utils/Flattenable.h> 231a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis#include <utils/RefBase.h> 241a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis#include <utils/SortedVector.h> 251a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis#include <utils/threads.h> 261a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis 271a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennisnamespace android { 281a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis 2990f43dce840b2a815426b6bfcdbe5f92358ab956Jamie Gennis// A BlobCache is an in-memory cache for binary key/value pairs. A BlobCache 3090f43dce840b2a815426b6bfcdbe5f92358ab956Jamie Gennis// does NOT provide any thread-safety guarantees. 311a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis// 327451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis// The cache contents can be serialized to an in-memory buffer or mmap'd file 337451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis// and then reloaded in a subsequent execution of the program. This 347451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis// serialization is non-portable and the data should only be used by the device 357451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis// that generated it. 366d611a891d0c818bf3a34a7cad036f3f0064bc4aMathias Agopianclass BlobCache : public RefBase { 376d611a891d0c818bf3a34a7cad036f3f0064bc4aMathias Agopian 381a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennispublic: 391a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis 401a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis // Create an empty blob cache. The blob cache will cache key/value pairs 411a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis // with key and value sizes less than or equal to maxKeySize and 421a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis // maxValueSize, respectively. The total combined size of ALL cache entries 431a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis // (key sizes plus value sizes) will not exceed maxTotalSize. 441a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis BlobCache(size_t maxKeySize, size_t maxValueSize, size_t maxTotalSize); 451a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis 461a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis // set inserts a new binary value into the cache and associates it with the 471a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis // given binary key. If the key or value are too large for the cache then 481a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis // the cache remains unchanged. This includes the case where a different 491a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis // value was previously associated with the given key - the old value will 501a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis // remain in the cache. If the given key and value are small enough to be 511a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis // put in the cache (based on the maxKeySize, maxValueSize, and maxTotalSize 521a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis // values specified to the BlobCache constructor), then the key/value pair 531a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis // will be in the cache after set returns. Note, however, that a subsequent 541a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis // call to set may evict old key/value pairs from the cache. 551a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis // 561a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis // Preconditions: 571a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis // key != NULL 581a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis // 0 < keySize 591a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis // value != NULL 601a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis // 0 < valueSize 611a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis void set(const void* key, size_t keySize, const void* value, 621a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis size_t valueSize); 631a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis 647451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis // get retrieves from the cache the binary value associated with a given 657451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis // binary key. If the key is present in the cache then the length of the 667451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis // binary value associated with that key is returned. If the value argument 677451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis // is non-NULL and the size of the cached value is less than valueSize bytes 687451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis // then the cached value is copied into the buffer pointed to by the value 697451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis // argument. If the key is not present in the cache then 0 is returned and 707451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis // the buffer pointed to by the value argument is not modified. 711a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis // 721a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis // Note that when calling get multiple times with the same key, the later 731a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis // calls may fail, returning 0, even if earlier calls succeeded. The return 741a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis // value must be checked for each call. 751a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis // 761a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis // Preconditions: 771a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis // key != NULL 781a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis // 0 < keySize 791a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis // 0 <= valueSize 801a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis size_t get(const void* key, size_t keySize, void* value, size_t valueSize); 811a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis 826d611a891d0c818bf3a34a7cad036f3f0064bc4aMathias Agopian 837451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis // getFlattenedSize returns the number of bytes needed to store the entire 847451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis // serialized cache. 856d611a891d0c818bf3a34a7cad036f3f0064bc4aMathias Agopian size_t getFlattenedSize() const; 867451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis 877451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis // flatten serializes the current contents of the cache into the memory 887451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis // pointed to by 'buffer'. The serialized cache contents can later be 897451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis // loaded into a BlobCache object using the unflatten method. The contents 907451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis // of the BlobCache object will not be modified. 917451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis // 927451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis // Preconditions: 937451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis // size >= this.getFlattenedSize() 946d611a891d0c818bf3a34a7cad036f3f0064bc4aMathias Agopian status_t flatten(void* buffer, size_t size) const; 957451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis 967451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis // unflatten replaces the contents of the cache with the serialized cache 977451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis // contents in the memory pointed to by 'buffer'. The previous contents of 987451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis // the BlobCache will be evicted from the cache. If an error occurs while 997451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis // unflattening the serialized cache contents then the BlobCache will be 1007451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis // left in an empty state. 1017451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis // 1026d611a891d0c818bf3a34a7cad036f3f0064bc4aMathias Agopian status_t unflatten(void const* buffer, size_t size); 1037451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis 1041a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennisprivate: 1051a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis // Copying is disallowed. 1061a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis BlobCache(const BlobCache&); 1071a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis void operator=(const BlobCache&); 1081a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis 109967ad860da30d09c2003274389cb53abe165b6ccKenny Root // A random function helper to get around MinGW not having nrand48() 110967ad860da30d09c2003274389cb53abe165b6ccKenny Root long int blob_random(); 111967ad860da30d09c2003274389cb53abe165b6ccKenny Root 1121a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis // clean evicts a randomly chosen set of entries from the cache such that 1131a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis // the total size of all remaining entries is less than mMaxTotalSize/2. 1141a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis void clean(); 1151a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis 1161a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis // isCleanable returns true if the cache is full enough for the clean method 1171a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis // to have some effect, and false otherwise. 1181a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis bool isCleanable() const; 1191a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis 1201a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis // A Blob is an immutable sized unstructured data blob. 1211a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis class Blob : public RefBase { 1221a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis public: 1231a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis Blob(const void* data, size_t size, bool copyData); 1241a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis ~Blob(); 1251a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis 1261a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis bool operator<(const Blob& rhs) const; 1271a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis 1281a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis const void* getData() const; 1291a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis size_t getSize() const; 1301a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis 1311a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis private: 1321a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis // Copying is not allowed. 1331a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis Blob(const Blob&); 1341a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis void operator=(const Blob&); 1351a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis 1361a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis // mData points to the buffer containing the blob data. 1371a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis const void* mData; 1381a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis 1391a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis // mSize is the size of the blob data in bytes. 1401a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis size_t mSize; 1411a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis 1421a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis // mOwnsData indicates whether or not this Blob object should free the 1431a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis // memory pointed to by mData when the Blob gets destructed. 1441a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis bool mOwnsData; 1451a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis }; 1461a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis 1471a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis // A CacheEntry is a single key/value pair in the cache. 1481a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis class CacheEntry { 1491a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis public: 1501a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis CacheEntry(); 1511a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis CacheEntry(const sp<Blob>& key, const sp<Blob>& value); 1521a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis CacheEntry(const CacheEntry& ce); 1531a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis 1541a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis bool operator<(const CacheEntry& rhs) const; 1551a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis const CacheEntry& operator=(const CacheEntry&); 1561a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis 1571a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis sp<Blob> getKey() const; 1581a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis sp<Blob> getValue() const; 1591a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis 1601a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis void setValue(const sp<Blob>& value); 1611a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis 1621a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis private: 1631a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis 1641a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis // mKey is the key that identifies the cache entry. 1651a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis sp<Blob> mKey; 1661a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis 1671a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis // mValue is the cached data associated with the key. 1681a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis sp<Blob> mValue; 1691a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis }; 1701a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis 1717451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis // A Header is the header for the entire BlobCache serialization format. No 1727451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis // need to make this portable, so we simply write the struct out. 1737451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis struct Header { 1747451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis // mMagicNumber is the magic number that identifies the data as 1757451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis // serialized BlobCache contents. It must always contain 'Blb$'. 1767451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis uint32_t mMagicNumber; 1777451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis 1787451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis // mBlobCacheVersion is the serialization format version. 1797451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis uint32_t mBlobCacheVersion; 1807451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis 1817451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis // mDeviceVersion is the device-specific version of the cache. This can 1827451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis // be used to invalidate the cache. 1837451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis uint32_t mDeviceVersion; 1847451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis 1857451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis // mNumEntries is number of cache entries following the header in the 1867451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis // data. 1877451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis size_t mNumEntries; 1887451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis }; 1897451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis 1907451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis // An EntryHeader is the header for a serialized cache entry. No need to 1917451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis // make this portable, so we simply write the struct out. Each EntryHeader 1927451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis // is followed imediately by the key data and then the value data. 1937451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis // 1947451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis // The beginning of each serialized EntryHeader is 4-byte aligned, so the 1957451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis // number of bytes that a serialized cache entry will occupy is: 1967451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis // 1977451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis // ((sizeof(EntryHeader) + keySize + valueSize) + 3) & ~3 1987451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis // 1997451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis struct EntryHeader { 2007451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis // mKeySize is the size of the entry key in bytes. 2017451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis size_t mKeySize; 2027451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis 2037451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis // mValueSize is the size of the entry value in bytes. 2047451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis size_t mValueSize; 2057451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis 2067451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis // mData contains both the key and value data for the cache entry. The 2077451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis // key comes first followed immediately by the value. 2087451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis uint8_t mData[]; 2097451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis }; 2107451bb44100d9d4915c3c4e4366ab92213947b4bJamie Gennis 2111a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis // mMaxKeySize is the maximum key size that will be cached. Calls to 2121a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis // BlobCache::set with a keySize parameter larger than mMaxKeySize will 2131a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis // simply not add the key/value pair to the cache. 2141a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis const size_t mMaxKeySize; 2151a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis 2161a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis // mMaxValueSize is the maximum value size that will be cached. Calls to 2171a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis // BlobCache::set with a valueSize parameter larger than mMaxValueSize will 2181a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis // simply not add the key/value pair to the cache. 2191a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis const size_t mMaxValueSize; 2201a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis 2211a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis // mMaxTotalSize is the maximum size that all cache entries can occupy. This 2221a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis // includes space for both keys and values. When a call to BlobCache::set 2231a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis // would otherwise cause this limit to be exceeded, either the key/value 2241a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis // pair passed to BlobCache::set will not be cached or other cache entries 2251a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis // will be evicted from the cache to make room for the new entry. 2261a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis const size_t mMaxTotalSize; 2271a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis 2281a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis // mTotalSize is the total combined size of all keys and values currently in 2291a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis // the cache. 2301a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis size_t mTotalSize; 2311a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis 2321a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis // mRandState is the pseudo-random number generator state. It is passed to 23390f43dce840b2a815426b6bfcdbe5f92358ab956Jamie Gennis // nrand48 to generate random numbers when needed. 2341a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis unsigned short mRandState[3]; 2351a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis 2361a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis // mCacheEntries stores all the cache entries that are resident in memory. 2371a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis // Cache entries are added to it by the 'set' method. 2381a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis SortedVector<CacheEntry> mCacheEntries; 2391a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis}; 2401a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis 2411a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis} 2421a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis 2431a20993c1000da3f008b34b7a5e6dbbd6fe291a6Jamie Gennis#endif // ANDROID_BLOB_CACHE_H 244