15976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org/* 25976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * libjingle 35976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * Copyright 2004--2005, Google Inc. 45976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * 55976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * Redistribution and use in source and binary forms, with or without 65976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * modification, are permitted provided that the following conditions are met: 75976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * 85976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * 1. Redistributions of source code must retain the above copyright notice, 95976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * this list of conditions and the following disclaimer. 105976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * 2. Redistributions in binary form must reproduce the above copyright notice, 115976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * this list of conditions and the following disclaimer in the documentation 125976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * and/or other materials provided with the distribution. 135976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * 3. The name of the author may not be used to endorse or promote products 145976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * derived from this software without specific prior written permission. 155976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * 165976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED 175976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 185976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO 195976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 205976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 215976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 225976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 235976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 245976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 255976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 265976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org */ 275976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 285976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#ifndef TALK_BASE_DISKCACHE_H__ 295976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#define TALK_BASE_DISKCACHE_H__ 305976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 315976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include <map> 325976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include <string> 335976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 345976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#ifdef WIN32 355976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#undef UnlockResource 365976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#endif // WIN32 375976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 385976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgnamespace talk_base { 395976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 405976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgclass StreamInterface; 415976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 425976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org/////////////////////////////////////////////////////////////////////////////// 435976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// DiskCache - An LRU cache of streams, stored on disk. 445976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// 455976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// Streams are identified by a unique resource id. Multiple streams can be 465976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// associated with each resource id, distinguished by an index. When old 475976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// resources are flushed from the cache, all streams associated with those 485976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// resources are removed together. 495976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// DiskCache is designed to persist across executions of the program. It is 505976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// safe for use from an arbitrary number of users on a single thread, but not 515976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// from multiple threads or other processes. 525976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org/////////////////////////////////////////////////////////////////////////////// 535976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 545976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgclass DiskCache { 555976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgpublic: 565976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org DiskCache(); 575976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org virtual ~DiskCache(); 585976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 595976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org bool Initialize(const std::string& folder, size_t size); 605976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org bool Purge(); 615976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 625976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org bool LockResource(const std::string& id); 635976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org StreamInterface* WriteResource(const std::string& id, size_t index); 645976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org bool UnlockResource(const std::string& id); 655976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 665976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org StreamInterface* ReadResource(const std::string& id, size_t index) const; 675976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 685976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org bool HasResource(const std::string& id) const; 695976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org bool HasResourceStream(const std::string& id, size_t index) const; 705976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org bool DeleteResource(const std::string& id); 715976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 725976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org protected: 735976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org virtual bool InitializeEntries() = 0; 745976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org virtual bool PurgeFiles() = 0; 755976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 765976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org virtual bool FileExists(const std::string& filename) const = 0; 775976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org virtual bool DeleteFile(const std::string& filename) const = 0; 785976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 795976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org enum LockState { LS_UNLOCKED, LS_LOCKED, LS_UNLOCKING }; 805976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org struct Entry { 815976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org LockState lock_state; 825976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org mutable size_t accessors; 835976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org size_t size; 845976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org size_t streams; 855976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org time_t last_modified; 865976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org }; 875976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org typedef std::map<std::string, Entry> EntryMap; 885976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org friend class DiskCacheAdapter; 895976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 905976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org bool CheckLimit(); 915976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 925976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org std::string IdToFilename(const std::string& id, size_t index) const; 935976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org bool FilenameToId(const std::string& filename, std::string* id, 945976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org size_t* index) const; 955976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 965976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org const Entry* GetEntry(const std::string& id) const { 975976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return const_cast<DiskCache*>(this)->GetOrCreateEntry(id, false); 985976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 995976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org Entry* GetOrCreateEntry(const std::string& id, bool create); 1005976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1015976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org void ReleaseResource(const std::string& id, size_t index) const; 1025976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1035976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org std::string folder_; 1045976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org size_t max_cache_, total_size_; 1055976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EntryMap map_; 1065976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org mutable size_t total_accessors_; 1075976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}; 1085976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1095976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org/////////////////////////////////////////////////////////////////////////////// 1105976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// CacheLock - Automatically manage locking and unlocking, with optional 1115976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org// rollback semantics 1125976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org/////////////////////////////////////////////////////////////////////////////// 1135976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1145976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgclass CacheLock { 1155976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgpublic: 1165976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org CacheLock(DiskCache* cache, const std::string& id, bool rollback = false) 1175976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org : cache_(cache), id_(id), rollback_(rollback) 1185976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org { 1195976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org locked_ = cache_->LockResource(id_); 1205976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 1215976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org ~CacheLock() { 1225976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (locked_) { 1235976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org cache_->UnlockResource(id_); 1245976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org if (rollback_) { 1255976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org cache_->DeleteResource(id_); 1265976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 1275976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 1285976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 1295976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org bool IsLocked() const { return locked_; } 1305976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org void Commit() { rollback_ = false; } 1315976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1325976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgprivate: 1335976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org DiskCache* cache_; 1345976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org std::string id_; 1355976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org bool rollback_, locked_; 1365976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}; 1375976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1385976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org/////////////////////////////////////////////////////////////////////////////// 1395976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1405976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} // namespace talk_base 1415976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1425976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#endif // TALK_BASE_DISKCACHE_H__ 143