158c8dd2aa9a8931a53923054679fb31fecc696c9Jamie Gennis/* 258c8dd2aa9a8931a53923054679fb31fecc696c9Jamie Gennis ** Copyright 2011, The Android Open Source Project 358c8dd2aa9a8931a53923054679fb31fecc696c9Jamie Gennis ** 458c8dd2aa9a8931a53923054679fb31fecc696c9Jamie Gennis ** Licensed under the Apache License, Version 2.0 (the "License"); 558c8dd2aa9a8931a53923054679fb31fecc696c9Jamie Gennis ** you may not use this file except in compliance with the License. 658c8dd2aa9a8931a53923054679fb31fecc696c9Jamie Gennis ** You may obtain a copy of the License at 758c8dd2aa9a8931a53923054679fb31fecc696c9Jamie Gennis ** 858c8dd2aa9a8931a53923054679fb31fecc696c9Jamie Gennis ** http://www.apache.org/licenses/LICENSE-2.0 958c8dd2aa9a8931a53923054679fb31fecc696c9Jamie Gennis ** 1058c8dd2aa9a8931a53923054679fb31fecc696c9Jamie Gennis ** Unless required by applicable law or agreed to in writing, software 1158c8dd2aa9a8931a53923054679fb31fecc696c9Jamie Gennis ** distributed under the License is distributed on an "AS IS" BASIS, 1258c8dd2aa9a8931a53923054679fb31fecc696c9Jamie Gennis ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1358c8dd2aa9a8931a53923054679fb31fecc696c9Jamie Gennis ** See the License for the specific language governing permissions and 1458c8dd2aa9a8931a53923054679fb31fecc696c9Jamie Gennis ** limitations under the License. 1558c8dd2aa9a8931a53923054679fb31fecc696c9Jamie Gennis */ 1658c8dd2aa9a8931a53923054679fb31fecc696c9Jamie Gennis 1758c8dd2aa9a8931a53923054679fb31fecc696c9Jamie Gennis#ifndef ANDROID_BLOB_CACHE_H 1858c8dd2aa9a8931a53923054679fb31fecc696c9Jamie Gennis#define ANDROID_BLOB_CACHE_H 1958c8dd2aa9a8931a53923054679fb31fecc696c9Jamie Gennis 2058c8dd2aa9a8931a53923054679fb31fecc696c9Jamie Gennis#include <stddef.h> 2158c8dd2aa9a8931a53923054679fb31fecc696c9Jamie Gennis 220e1bc174293d4802f06641187dc5bf632f4e938aJamie Gennis#include <utils/Flattenable.h> 2358c8dd2aa9a8931a53923054679fb31fecc696c9Jamie Gennis#include <utils/RefBase.h> 2458c8dd2aa9a8931a53923054679fb31fecc696c9Jamie Gennis#include <utils/SortedVector.h> 2558c8dd2aa9a8931a53923054679fb31fecc696c9Jamie Gennis#include <utils/threads.h> 2658c8dd2aa9a8931a53923054679fb31fecc696c9Jamie Gennis 2758c8dd2aa9a8931a53923054679fb31fecc696c9Jamie Gennisnamespace android { 2858c8dd2aa9a8931a53923054679fb31fecc696c9Jamie Gennis 2993ca6fb91c613c7dfa287571f32c5c44a797961fJamie Gennis// A BlobCache is an in-memory cache for binary key/value pairs. A BlobCache 3093ca6fb91c613c7dfa287571f32c5c44a797961fJamie Gennis// does NOT provide any thread-safety guarantees. 3158c8dd2aa9a8931a53923054679fb31fecc696c9Jamie Gennis// 320e1bc174293d4802f06641187dc5bf632f4e938aJamie Gennis// The cache contents can be serialized to an in-memory buffer or mmap'd file 330e1bc174293d4802f06641187dc5bf632f4e938aJamie Gennis// and then reloaded in a subsequent execution of the program. This 340e1bc174293d4802f06641187dc5bf632f4e938aJamie Gennis// serialization is non-portable and the data should only be used by the device 350e1bc174293d4802f06641187dc5bf632f4e938aJamie Gennis// that generated it. 360e1bc174293d4802f06641187dc5bf632f4e938aJamie Gennisclass BlobCache : public RefBase, public Flattenable { 3758c8dd2aa9a8931a53923054679fb31fecc696c9Jamie Gennispublic: 3858c8dd2aa9a8931a53923054679fb31fecc696c9Jamie Gennis 3958c8dd2aa9a8931a53923054679fb31fecc696c9Jamie Gennis // Create an empty blob cache. The blob cache will cache key/value pairs 4058c8dd2aa9a8931a53923054679fb31fecc696c9Jamie Gennis // with key and value sizes less than or equal to maxKeySize and 4158c8dd2aa9a8931a53923054679fb31fecc696c9Jamie Gennis // maxValueSize, respectively. The total combined size of ALL cache entries 4258c8dd2aa9a8931a53923054679fb31fecc696c9Jamie Gennis // (key sizes plus value sizes) will not exceed maxTotalSize. 4358c8dd2aa9a8931a53923054679fb31fecc696c9Jamie Gennis BlobCache(size_t maxKeySize, size_t maxValueSize, size_t maxTotalSize); 4458c8dd2aa9a8931a53923054679fb31fecc696c9Jamie Gennis 4558c8dd2aa9a8931a53923054679fb31fecc696c9Jamie Gennis // set inserts a new binary value into the cache and associates it with the 4658c8dd2aa9a8931a53923054679fb31fecc696c9Jamie Gennis // given binary key. If the key or value are too large for the cache then 4758c8dd2aa9a8931a53923054679fb31fecc696c9Jamie Gennis // the cache remains unchanged. This includes the case where a different 4858c8dd2aa9a8931a53923054679fb31fecc696c9Jamie Gennis // value was previously associated with the given key - the old value will 4958c8dd2aa9a8931a53923054679fb31fecc696c9Jamie Gennis // remain in the cache. If the given key and value are small enough to be 5058c8dd2aa9a8931a53923054679fb31fecc696c9Jamie Gennis // put in the cache (based on the maxKeySize, maxValueSize, and maxTotalSize 5158c8dd2aa9a8931a53923054679fb31fecc696c9Jamie Gennis // values specified to the BlobCache constructor), then the key/value pair 5258c8dd2aa9a8931a53923054679fb31fecc696c9Jamie Gennis // will be in the cache after set returns. Note, however, that a subsequent 5358c8dd2aa9a8931a53923054679fb31fecc696c9Jamie Gennis // call to set may evict old key/value pairs from the cache. 5458c8dd2aa9a8931a53923054679fb31fecc696c9Jamie Gennis // 5558c8dd2aa9a8931a53923054679fb31fecc696c9Jamie Gennis // Preconditions: 5658c8dd2aa9a8931a53923054679fb31fecc696c9Jamie Gennis // key != NULL 5758c8dd2aa9a8931a53923054679fb31fecc696c9Jamie Gennis // 0 < keySize 5858c8dd2aa9a8931a53923054679fb31fecc696c9Jamie Gennis // value != NULL 5958c8dd2aa9a8931a53923054679fb31fecc696c9Jamie Gennis // 0 < valueSize 6058c8dd2aa9a8931a53923054679fb31fecc696c9Jamie Gennis void set(const void* key, size_t keySize, const void* value, 6158c8dd2aa9a8931a53923054679fb31fecc696c9Jamie Gennis size_t valueSize); 6258c8dd2aa9a8931a53923054679fb31fecc696c9Jamie Gennis 630e1bc174293d4802f06641187dc5bf632f4e938aJamie Gennis // get retrieves from the cache the binary value associated with a given 640e1bc174293d4802f06641187dc5bf632f4e938aJamie Gennis // binary key. If the key is present in the cache then the length of the 650e1bc174293d4802f06641187dc5bf632f4e938aJamie Gennis // binary value associated with that key is returned. If the value argument 660e1bc174293d4802f06641187dc5bf632f4e938aJamie Gennis // is non-NULL and the size of the cached value is less than valueSize bytes 670e1bc174293d4802f06641187dc5bf632f4e938aJamie Gennis // then the cached value is copied into the buffer pointed to by the value 680e1bc174293d4802f06641187dc5bf632f4e938aJamie Gennis // argument. If the key is not present in the cache then 0 is returned and 690e1bc174293d4802f06641187dc5bf632f4e938aJamie Gennis // the buffer pointed to by the value argument is not modified. 7058c8dd2aa9a8931a53923054679fb31fecc696c9Jamie Gennis // 7158c8dd2aa9a8931a53923054679fb31fecc696c9Jamie Gennis // Note that when calling get multiple times with the same key, the later 7258c8dd2aa9a8931a53923054679fb31fecc696c9Jamie Gennis // calls may fail, returning 0, even if earlier calls succeeded. The return 7358c8dd2aa9a8931a53923054679fb31fecc696c9Jamie Gennis // value must be checked for each call. 7458c8dd2aa9a8931a53923054679fb31fecc696c9Jamie Gennis // 7558c8dd2aa9a8931a53923054679fb31fecc696c9Jamie Gennis // Preconditions: 7658c8dd2aa9a8931a53923054679fb31fecc696c9Jamie Gennis // key != NULL 7758c8dd2aa9a8931a53923054679fb31fecc696c9Jamie Gennis // 0 < keySize 7858c8dd2aa9a8931a53923054679fb31fecc696c9Jamie Gennis // 0 <= valueSize 7958c8dd2aa9a8931a53923054679fb31fecc696c9Jamie Gennis size_t get(const void* key, size_t keySize, void* value, size_t valueSize); 8058c8dd2aa9a8931a53923054679fb31fecc696c9Jamie Gennis 810e1bc174293d4802f06641187dc5bf632f4e938aJamie Gennis // getFlattenedSize returns the number of bytes needed to store the entire 820e1bc174293d4802f06641187dc5bf632f4e938aJamie Gennis // serialized cache. 830e1bc174293d4802f06641187dc5bf632f4e938aJamie Gennis virtual size_t getFlattenedSize() const; 840e1bc174293d4802f06641187dc5bf632f4e938aJamie Gennis 850e1bc174293d4802f06641187dc5bf632f4e938aJamie Gennis // getFdCount returns the number of file descriptors that will result from 860e1bc174293d4802f06641187dc5bf632f4e938aJamie Gennis // flattening the cache. This will always return 0 so as to allow the 870e1bc174293d4802f06641187dc5bf632f4e938aJamie Gennis // flattened cache to be saved to disk and then later restored. 880e1bc174293d4802f06641187dc5bf632f4e938aJamie Gennis virtual size_t getFdCount() const; 890e1bc174293d4802f06641187dc5bf632f4e938aJamie Gennis 900e1bc174293d4802f06641187dc5bf632f4e938aJamie Gennis // flatten serializes the current contents of the cache into the memory 910e1bc174293d4802f06641187dc5bf632f4e938aJamie Gennis // pointed to by 'buffer'. The serialized cache contents can later be 920e1bc174293d4802f06641187dc5bf632f4e938aJamie Gennis // loaded into a BlobCache object using the unflatten method. The contents 930e1bc174293d4802f06641187dc5bf632f4e938aJamie Gennis // of the BlobCache object will not be modified. 940e1bc174293d4802f06641187dc5bf632f4e938aJamie Gennis // 950e1bc174293d4802f06641187dc5bf632f4e938aJamie Gennis // Preconditions: 960e1bc174293d4802f06641187dc5bf632f4e938aJamie Gennis // size >= this.getFlattenedSize() 970e1bc174293d4802f06641187dc5bf632f4e938aJamie Gennis // count == 0 980e1bc174293d4802f06641187dc5bf632f4e938aJamie Gennis virtual status_t flatten(void* buffer, size_t size, int fds[], 990e1bc174293d4802f06641187dc5bf632f4e938aJamie Gennis size_t count) const; 1000e1bc174293d4802f06641187dc5bf632f4e938aJamie Gennis 1010e1bc174293d4802f06641187dc5bf632f4e938aJamie Gennis // unflatten replaces the contents of the cache with the serialized cache 1020e1bc174293d4802f06641187dc5bf632f4e938aJamie Gennis // contents in the memory pointed to by 'buffer'. The previous contents of 1030e1bc174293d4802f06641187dc5bf632f4e938aJamie Gennis // the BlobCache will be evicted from the cache. If an error occurs while 1040e1bc174293d4802f06641187dc5bf632f4e938aJamie Gennis // unflattening the serialized cache contents then the BlobCache will be 1050e1bc174293d4802f06641187dc5bf632f4e938aJamie Gennis // left in an empty state. 1060e1bc174293d4802f06641187dc5bf632f4e938aJamie Gennis // 1070e1bc174293d4802f06641187dc5bf632f4e938aJamie Gennis // Preconditions: 1080e1bc174293d4802f06641187dc5bf632f4e938aJamie Gennis // count == 0 1090e1bc174293d4802f06641187dc5bf632f4e938aJamie Gennis virtual status_t unflatten(void const* buffer, size_t size, int fds[], 1100e1bc174293d4802f06641187dc5bf632f4e938aJamie Gennis size_t count); 1110e1bc174293d4802f06641187dc5bf632f4e938aJamie Gennis 11258c8dd2aa9a8931a53923054679fb31fecc696c9Jamie Gennisprivate: 11358c8dd2aa9a8931a53923054679fb31fecc696c9Jamie Gennis // Copying is disallowed. 11458c8dd2aa9a8931a53923054679fb31fecc696c9Jamie Gennis BlobCache(const BlobCache&); 11558c8dd2aa9a8931a53923054679fb31fecc696c9Jamie Gennis void operator=(const BlobCache&); 11658c8dd2aa9a8931a53923054679fb31fecc696c9Jamie Gennis 117111280a8de1700f718744f48d163789473b9da30Kenny Root // A random function helper to get around MinGW not having nrand48() 118111280a8de1700f718744f48d163789473b9da30Kenny Root long int blob_random(); 119111280a8de1700f718744f48d163789473b9da30Kenny Root 12058c8dd2aa9a8931a53923054679fb31fecc696c9Jamie Gennis // clean evicts a randomly chosen set of entries from the cache such that 12158c8dd2aa9a8931a53923054679fb31fecc696c9Jamie Gennis // the total size of all remaining entries is less than mMaxTotalSize/2. 12258c8dd2aa9a8931a53923054679fb31fecc696c9Jamie Gennis void clean(); 12358c8dd2aa9a8931a53923054679fb31fecc696c9Jamie Gennis 12458c8dd2aa9a8931a53923054679fb31fecc696c9Jamie Gennis // isCleanable returns true if the cache is full enough for the clean method 12558c8dd2aa9a8931a53923054679fb31fecc696c9Jamie Gennis // to have some effect, and false otherwise. 12658c8dd2aa9a8931a53923054679fb31fecc696c9Jamie Gennis bool isCleanable() const; 12758c8dd2aa9a8931a53923054679fb31fecc696c9Jamie Gennis 12858c8dd2aa9a8931a53923054679fb31fecc696c9Jamie Gennis // A Blob is an immutable sized unstructured data blob. 12958c8dd2aa9a8931a53923054679fb31fecc696c9Jamie Gennis class Blob : public RefBase { 13058c8dd2aa9a8931a53923054679fb31fecc696c9Jamie Gennis public: 13158c8dd2aa9a8931a53923054679fb31fecc696c9Jamie Gennis Blob(const void* data, size_t size, bool copyData); 13258c8dd2aa9a8931a53923054679fb31fecc696c9Jamie Gennis ~Blob(); 13358c8dd2aa9a8931a53923054679fb31fecc696c9Jamie Gennis 13458c8dd2aa9a8931a53923054679fb31fecc696c9Jamie Gennis bool operator<(const Blob& rhs) const; 13558c8dd2aa9a8931a53923054679fb31fecc696c9Jamie Gennis 13658c8dd2aa9a8931a53923054679fb31fecc696c9Jamie Gennis const void* getData() const; 13758c8dd2aa9a8931a53923054679fb31fecc696c9Jamie Gennis size_t getSize() const; 13858c8dd2aa9a8931a53923054679fb31fecc696c9Jamie Gennis 13958c8dd2aa9a8931a53923054679fb31fecc696c9Jamie Gennis private: 14058c8dd2aa9a8931a53923054679fb31fecc696c9Jamie Gennis // Copying is not allowed. 14158c8dd2aa9a8931a53923054679fb31fecc696c9Jamie Gennis Blob(const Blob&); 14258c8dd2aa9a8931a53923054679fb31fecc696c9Jamie Gennis void operator=(const Blob&); 14358c8dd2aa9a8931a53923054679fb31fecc696c9Jamie Gennis 14458c8dd2aa9a8931a53923054679fb31fecc696c9Jamie Gennis // mData points to the buffer containing the blob data. 14558c8dd2aa9a8931a53923054679fb31fecc696c9Jamie Gennis const void* mData; 14658c8dd2aa9a8931a53923054679fb31fecc696c9Jamie Gennis 14758c8dd2aa9a8931a53923054679fb31fecc696c9Jamie Gennis // mSize is the size of the blob data in bytes. 14858c8dd2aa9a8931a53923054679fb31fecc696c9Jamie Gennis size_t mSize; 14958c8dd2aa9a8931a53923054679fb31fecc696c9Jamie Gennis 15058c8dd2aa9a8931a53923054679fb31fecc696c9Jamie Gennis // mOwnsData indicates whether or not this Blob object should free the 15158c8dd2aa9a8931a53923054679fb31fecc696c9Jamie Gennis // memory pointed to by mData when the Blob gets destructed. 15258c8dd2aa9a8931a53923054679fb31fecc696c9Jamie Gennis bool mOwnsData; 15358c8dd2aa9a8931a53923054679fb31fecc696c9Jamie Gennis }; 15458c8dd2aa9a8931a53923054679fb31fecc696c9Jamie Gennis 15558c8dd2aa9a8931a53923054679fb31fecc696c9Jamie Gennis // A CacheEntry is a single key/value pair in the cache. 15658c8dd2aa9a8931a53923054679fb31fecc696c9Jamie Gennis class CacheEntry { 15758c8dd2aa9a8931a53923054679fb31fecc696c9Jamie Gennis public: 15858c8dd2aa9a8931a53923054679fb31fecc696c9Jamie Gennis CacheEntry(); 15958c8dd2aa9a8931a53923054679fb31fecc696c9Jamie Gennis CacheEntry(const sp<Blob>& key, const sp<Blob>& value); 16058c8dd2aa9a8931a53923054679fb31fecc696c9Jamie Gennis CacheEntry(const CacheEntry& ce); 16158c8dd2aa9a8931a53923054679fb31fecc696c9Jamie Gennis 16258c8dd2aa9a8931a53923054679fb31fecc696c9Jamie Gennis bool operator<(const CacheEntry& rhs) const; 16358c8dd2aa9a8931a53923054679fb31fecc696c9Jamie Gennis const CacheEntry& operator=(const CacheEntry&); 16458c8dd2aa9a8931a53923054679fb31fecc696c9Jamie Gennis 16558c8dd2aa9a8931a53923054679fb31fecc696c9Jamie Gennis sp<Blob> getKey() const; 16658c8dd2aa9a8931a53923054679fb31fecc696c9Jamie Gennis sp<Blob> getValue() const; 16758c8dd2aa9a8931a53923054679fb31fecc696c9Jamie Gennis 16858c8dd2aa9a8931a53923054679fb31fecc696c9Jamie Gennis void setValue(const sp<Blob>& value); 16958c8dd2aa9a8931a53923054679fb31fecc696c9Jamie Gennis 17058c8dd2aa9a8931a53923054679fb31fecc696c9Jamie Gennis private: 17158c8dd2aa9a8931a53923054679fb31fecc696c9Jamie Gennis 17258c8dd2aa9a8931a53923054679fb31fecc696c9Jamie Gennis // mKey is the key that identifies the cache entry. 17358c8dd2aa9a8931a53923054679fb31fecc696c9Jamie Gennis sp<Blob> mKey; 17458c8dd2aa9a8931a53923054679fb31fecc696c9Jamie Gennis 17558c8dd2aa9a8931a53923054679fb31fecc696c9Jamie Gennis // mValue is the cached data associated with the key. 17658c8dd2aa9a8931a53923054679fb31fecc696c9Jamie Gennis sp<Blob> mValue; 17758c8dd2aa9a8931a53923054679fb31fecc696c9Jamie Gennis }; 17858c8dd2aa9a8931a53923054679fb31fecc696c9Jamie Gennis 1790e1bc174293d4802f06641187dc5bf632f4e938aJamie Gennis // A Header is the header for the entire BlobCache serialization format. No 1800e1bc174293d4802f06641187dc5bf632f4e938aJamie Gennis // need to make this portable, so we simply write the struct out. 1810e1bc174293d4802f06641187dc5bf632f4e938aJamie Gennis struct Header { 1820e1bc174293d4802f06641187dc5bf632f4e938aJamie Gennis // mMagicNumber is the magic number that identifies the data as 1830e1bc174293d4802f06641187dc5bf632f4e938aJamie Gennis // serialized BlobCache contents. It must always contain 'Blb$'. 1840e1bc174293d4802f06641187dc5bf632f4e938aJamie Gennis uint32_t mMagicNumber; 1850e1bc174293d4802f06641187dc5bf632f4e938aJamie Gennis 1860e1bc174293d4802f06641187dc5bf632f4e938aJamie Gennis // mBlobCacheVersion is the serialization format version. 1870e1bc174293d4802f06641187dc5bf632f4e938aJamie Gennis uint32_t mBlobCacheVersion; 1880e1bc174293d4802f06641187dc5bf632f4e938aJamie Gennis 1890e1bc174293d4802f06641187dc5bf632f4e938aJamie Gennis // mDeviceVersion is the device-specific version of the cache. This can 1900e1bc174293d4802f06641187dc5bf632f4e938aJamie Gennis // be used to invalidate the cache. 1910e1bc174293d4802f06641187dc5bf632f4e938aJamie Gennis uint32_t mDeviceVersion; 1920e1bc174293d4802f06641187dc5bf632f4e938aJamie Gennis 1930e1bc174293d4802f06641187dc5bf632f4e938aJamie Gennis // mNumEntries is number of cache entries following the header in the 1940e1bc174293d4802f06641187dc5bf632f4e938aJamie Gennis // data. 1950e1bc174293d4802f06641187dc5bf632f4e938aJamie Gennis size_t mNumEntries; 1960e1bc174293d4802f06641187dc5bf632f4e938aJamie Gennis }; 1970e1bc174293d4802f06641187dc5bf632f4e938aJamie Gennis 1980e1bc174293d4802f06641187dc5bf632f4e938aJamie Gennis // An EntryHeader is the header for a serialized cache entry. No need to 1990e1bc174293d4802f06641187dc5bf632f4e938aJamie Gennis // make this portable, so we simply write the struct out. Each EntryHeader 2000e1bc174293d4802f06641187dc5bf632f4e938aJamie Gennis // is followed imediately by the key data and then the value data. 2010e1bc174293d4802f06641187dc5bf632f4e938aJamie Gennis // 2020e1bc174293d4802f06641187dc5bf632f4e938aJamie Gennis // The beginning of each serialized EntryHeader is 4-byte aligned, so the 2030e1bc174293d4802f06641187dc5bf632f4e938aJamie Gennis // number of bytes that a serialized cache entry will occupy is: 2040e1bc174293d4802f06641187dc5bf632f4e938aJamie Gennis // 2050e1bc174293d4802f06641187dc5bf632f4e938aJamie Gennis // ((sizeof(EntryHeader) + keySize + valueSize) + 3) & ~3 2060e1bc174293d4802f06641187dc5bf632f4e938aJamie Gennis // 2070e1bc174293d4802f06641187dc5bf632f4e938aJamie Gennis struct EntryHeader { 2080e1bc174293d4802f06641187dc5bf632f4e938aJamie Gennis // mKeySize is the size of the entry key in bytes. 2090e1bc174293d4802f06641187dc5bf632f4e938aJamie Gennis size_t mKeySize; 2100e1bc174293d4802f06641187dc5bf632f4e938aJamie Gennis 2110e1bc174293d4802f06641187dc5bf632f4e938aJamie Gennis // mValueSize is the size of the entry value in bytes. 2120e1bc174293d4802f06641187dc5bf632f4e938aJamie Gennis size_t mValueSize; 2130e1bc174293d4802f06641187dc5bf632f4e938aJamie Gennis 2140e1bc174293d4802f06641187dc5bf632f4e938aJamie Gennis // mData contains both the key and value data for the cache entry. The 2150e1bc174293d4802f06641187dc5bf632f4e938aJamie Gennis // key comes first followed immediately by the value. 2160e1bc174293d4802f06641187dc5bf632f4e938aJamie Gennis uint8_t mData[]; 2170e1bc174293d4802f06641187dc5bf632f4e938aJamie Gennis }; 2180e1bc174293d4802f06641187dc5bf632f4e938aJamie Gennis 21958c8dd2aa9a8931a53923054679fb31fecc696c9Jamie Gennis // mMaxKeySize is the maximum key size that will be cached. Calls to 22058c8dd2aa9a8931a53923054679fb31fecc696c9Jamie Gennis // BlobCache::set with a keySize parameter larger than mMaxKeySize will 22158c8dd2aa9a8931a53923054679fb31fecc696c9Jamie Gennis // simply not add the key/value pair to the cache. 22258c8dd2aa9a8931a53923054679fb31fecc696c9Jamie Gennis const size_t mMaxKeySize; 22358c8dd2aa9a8931a53923054679fb31fecc696c9Jamie Gennis 22458c8dd2aa9a8931a53923054679fb31fecc696c9Jamie Gennis // mMaxValueSize is the maximum value size that will be cached. Calls to 22558c8dd2aa9a8931a53923054679fb31fecc696c9Jamie Gennis // BlobCache::set with a valueSize parameter larger than mMaxValueSize will 22658c8dd2aa9a8931a53923054679fb31fecc696c9Jamie Gennis // simply not add the key/value pair to the cache. 22758c8dd2aa9a8931a53923054679fb31fecc696c9Jamie Gennis const size_t mMaxValueSize; 22858c8dd2aa9a8931a53923054679fb31fecc696c9Jamie Gennis 22958c8dd2aa9a8931a53923054679fb31fecc696c9Jamie Gennis // mMaxTotalSize is the maximum size that all cache entries can occupy. This 23058c8dd2aa9a8931a53923054679fb31fecc696c9Jamie Gennis // includes space for both keys and values. When a call to BlobCache::set 23158c8dd2aa9a8931a53923054679fb31fecc696c9Jamie Gennis // would otherwise cause this limit to be exceeded, either the key/value 23258c8dd2aa9a8931a53923054679fb31fecc696c9Jamie Gennis // pair passed to BlobCache::set will not be cached or other cache entries 23358c8dd2aa9a8931a53923054679fb31fecc696c9Jamie Gennis // will be evicted from the cache to make room for the new entry. 23458c8dd2aa9a8931a53923054679fb31fecc696c9Jamie Gennis const size_t mMaxTotalSize; 23558c8dd2aa9a8931a53923054679fb31fecc696c9Jamie Gennis 23658c8dd2aa9a8931a53923054679fb31fecc696c9Jamie Gennis // mTotalSize is the total combined size of all keys and values currently in 23758c8dd2aa9a8931a53923054679fb31fecc696c9Jamie Gennis // the cache. 23858c8dd2aa9a8931a53923054679fb31fecc696c9Jamie Gennis size_t mTotalSize; 23958c8dd2aa9a8931a53923054679fb31fecc696c9Jamie Gennis 24058c8dd2aa9a8931a53923054679fb31fecc696c9Jamie Gennis // mRandState is the pseudo-random number generator state. It is passed to 24193ca6fb91c613c7dfa287571f32c5c44a797961fJamie Gennis // nrand48 to generate random numbers when needed. 24258c8dd2aa9a8931a53923054679fb31fecc696c9Jamie Gennis unsigned short mRandState[3]; 24358c8dd2aa9a8931a53923054679fb31fecc696c9Jamie Gennis 24458c8dd2aa9a8931a53923054679fb31fecc696c9Jamie Gennis // mCacheEntries stores all the cache entries that are resident in memory. 24558c8dd2aa9a8931a53923054679fb31fecc696c9Jamie Gennis // Cache entries are added to it by the 'set' method. 24658c8dd2aa9a8931a53923054679fb31fecc696c9Jamie Gennis SortedVector<CacheEntry> mCacheEntries; 24758c8dd2aa9a8931a53923054679fb31fecc696c9Jamie Gennis}; 24858c8dd2aa9a8931a53923054679fb31fecc696c9Jamie Gennis 24958c8dd2aa9a8931a53923054679fb31fecc696c9Jamie Gennis} 25058c8dd2aa9a8931a53923054679fb31fecc696c9Jamie Gennis 25158c8dd2aa9a8931a53923054679fb31fecc696c9Jamie Gennis#endif // ANDROID_BLOB_CACHE_H 252