1f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch/* 2f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * libjingle 3f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * Copyright 2004--2005, Google Inc. 4f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * 5f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * Redistribution and use in source and binary forms, with or without 6f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * modification, are permitted provided that the following conditions are met: 7f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * 8f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * 1. Redistributions of source code must retain the above copyright notice, 9f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * this list of conditions and the following disclaimer. 10f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * 2. Redistributions in binary form must reproduce the above copyright notice, 11f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * this list of conditions and the following disclaimer in the documentation 12f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * and/or other materials provided with the distribution. 13f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * 3. The name of the author may not be used to endorse or promote products 14f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * derived from this software without specific prior written permission. 15f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * 16f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED 17f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 18f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO 19f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 20f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 21f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 22f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 23f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 24f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 25f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 26f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch */ 27f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 28f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#ifndef TALK_BASE_DISKCACHE_H__ 29f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#define TALK_BASE_DISKCACHE_H__ 30f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 31f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#include <map> 32f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#include <string> 33f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 34f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#ifdef WIN32 35f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#undef UnlockResource 36f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#endif // WIN32 37f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 38f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochnamespace talk_base { 39f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 40f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochclass StreamInterface; 41f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 42f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch/////////////////////////////////////////////////////////////////////////////// 43f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch// DiskCache - An LRU cache of streams, stored on disk. 44f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch// 45f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch// Streams are identified by a unique resource id. Multiple streams can be 46f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch// associated with each resource id, distinguished by an index. When old 47f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch// resources are flushed from the cache, all streams associated with those 48f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch// resources are removed together. 49f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch// DiskCache is designed to persist across executions of the program. It is 50f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch// safe for use from an arbitrary number of users on a single thread, but not 51f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch// from multiple threads or other processes. 52f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch/////////////////////////////////////////////////////////////////////////////// 53f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 54f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochclass DiskCache { 55f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochpublic: 56f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch DiskCache(); 57f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch virtual ~DiskCache(); 58f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 59f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch bool Initialize(const std::string& folder, size_t size); 60f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch bool Purge(); 61f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 62f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch bool LockResource(const std::string& id); 63f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch StreamInterface* WriteResource(const std::string& id, size_t index); 64f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch bool UnlockResource(const std::string& id); 65f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 66f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch StreamInterface* ReadResource(const std::string& id, size_t index) const; 67f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 68f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch bool HasResource(const std::string& id) const; 69f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch bool HasResourceStream(const std::string& id, size_t index) const; 70f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch bool DeleteResource(const std::string& id); 71f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 72f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch protected: 73f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch virtual bool InitializeEntries() = 0; 74f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch virtual bool PurgeFiles() = 0; 75f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 76f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch virtual bool FileExists(const std::string& filename) const = 0; 77f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch virtual bool DeleteFile(const std::string& filename) const = 0; 78f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 79f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch enum LockState { LS_UNLOCKED, LS_LOCKED, LS_UNLOCKING }; 80f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch struct Entry { 81f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch LockState lock_state; 82f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch mutable size_t accessors; 83f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch size_t size; 84f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch size_t streams; 85f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch time_t last_modified; 86f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch }; 87f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch typedef std::map<std::string, Entry> EntryMap; 88f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch friend class DiskCacheAdapter; 89f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 90f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch bool CheckLimit(); 91f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 92f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch std::string IdToFilename(const std::string& id, size_t index) const; 93f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch bool FilenameToId(const std::string& filename, std::string* id, 94f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch size_t* index) const; 95f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 96f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch const Entry* GetEntry(const std::string& id) const { 97f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch return const_cast<DiskCache*>(this)->GetOrCreateEntry(id, false); 98f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch } 99f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch Entry* GetOrCreateEntry(const std::string& id, bool create); 100f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 101f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch void ReleaseResource(const std::string& id, size_t index) const; 102f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 103f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch std::string folder_; 104f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch size_t max_cache_, total_size_; 105f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch EntryMap map_; 106f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch mutable size_t total_accessors_; 107f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch}; 108f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 109f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch/////////////////////////////////////////////////////////////////////////////// 110f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch// CacheLock - Automatically manage locking and unlocking, with optional 111f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch// rollback semantics 112f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch/////////////////////////////////////////////////////////////////////////////// 113f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 114f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochclass CacheLock { 115f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochpublic: 116f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch CacheLock(DiskCache* cache, const std::string& id, bool rollback = false) 117f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch : cache_(cache), id_(id), rollback_(rollback) 118f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch { 119f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch locked_ = cache_->LockResource(id_); 120f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch } 121f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch ~CacheLock() { 122f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch if (locked_) { 123f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch cache_->UnlockResource(id_); 124f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch if (rollback_) { 125f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch cache_->DeleteResource(id_); 126f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch } 127f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch } 128f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch } 129f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch bool IsLocked() const { return locked_; } 130f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch void Commit() { rollback_ = false; } 131f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 132f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdochprivate: 133f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch DiskCache* cache_; 134f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch std::string id_; 135f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch bool rollback_, locked_; 136f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch}; 137f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 138f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch/////////////////////////////////////////////////////////////////////////////// 139f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 140f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch} // namespace talk_base 141f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch 142f74420b3285b9fe04a7e00aa3b8c0ab07ea344bcBen Murdoch#endif // TALK_BASE_DISKCACHE_H__ 143