OLD | NEW |
| (Empty) |
1 /* | |
2 * Copyright 2004 The WebRTC Project Authors. All rights reserved. | |
3 * | |
4 * Use of this source code is governed by a BSD-style license | |
5 * that can be found in the LICENSE file in the root of the source | |
6 * tree. An additional intellectual property rights grant can be found | |
7 * in the file PATENTS. All contributing project authors may | |
8 * be found in the AUTHORS file in the root of the source tree. | |
9 */ | |
10 | |
11 #ifndef WEBRTC_BASE_DISKCACHE_H__ | |
12 #define WEBRTC_BASE_DISKCACHE_H__ | |
13 | |
14 #include <map> | |
15 #include <string> | |
16 | |
17 #if defined(WEBRTC_WIN) | |
18 #undef UnlockResource | |
19 #endif // WEBRTC_WIN | |
20 | |
21 namespace rtc { | |
22 | |
23 class StreamInterface; | |
24 | |
25 /////////////////////////////////////////////////////////////////////////////// | |
26 // DiskCache - An LRU cache of streams, stored on disk. | |
27 // | |
28 // Streams are identified by a unique resource id. Multiple streams can be | |
29 // associated with each resource id, distinguished by an index. When old | |
30 // resources are flushed from the cache, all streams associated with those | |
31 // resources are removed together. | |
32 // DiskCache is designed to persist across executions of the program. It is | |
33 // safe for use from an arbitrary number of users on a single thread, but not | |
34 // from multiple threads or other processes. | |
35 /////////////////////////////////////////////////////////////////////////////// | |
36 | |
37 class DiskCache { | |
38 public: | |
39 DiskCache(); | |
40 virtual ~DiskCache(); | |
41 | |
42 bool Initialize(const std::string& folder, size_t size); | |
43 bool Purge(); | |
44 | |
45 bool LockResource(const std::string& id); | |
46 StreamInterface* WriteResource(const std::string& id, size_t index); | |
47 bool UnlockResource(const std::string& id); | |
48 | |
49 StreamInterface* ReadResource(const std::string& id, size_t index) const; | |
50 | |
51 bool HasResource(const std::string& id) const; | |
52 bool HasResourceStream(const std::string& id, size_t index) const; | |
53 bool DeleteResource(const std::string& id); | |
54 | |
55 protected: | |
56 virtual bool InitializeEntries() = 0; | |
57 virtual bool PurgeFiles() = 0; | |
58 | |
59 virtual bool FileExists(const std::string& filename) const = 0; | |
60 virtual bool DeleteFile(const std::string& filename) const = 0; | |
61 | |
62 enum LockState { LS_UNLOCKED, LS_LOCKED, LS_UNLOCKING }; | |
63 struct Entry { | |
64 LockState lock_state; | |
65 mutable size_t accessors; | |
66 size_t size; | |
67 size_t streams; | |
68 time_t last_modified; | |
69 }; | |
70 typedef std::map<std::string, Entry> EntryMap; | |
71 friend class DiskCacheAdapter; | |
72 | |
73 bool CheckLimit(); | |
74 | |
75 std::string IdToFilename(const std::string& id, size_t index) const; | |
76 bool FilenameToId(const std::string& filename, std::string* id, | |
77 size_t* index) const; | |
78 | |
79 const Entry* GetEntry(const std::string& id) const { | |
80 return const_cast<DiskCache*>(this)->GetOrCreateEntry(id, false); | |
81 } | |
82 Entry* GetOrCreateEntry(const std::string& id, bool create); | |
83 | |
84 void ReleaseResource(const std::string& id, size_t index) const; | |
85 | |
86 std::string folder_; | |
87 size_t max_cache_, total_size_; | |
88 EntryMap map_; | |
89 mutable size_t total_accessors_; | |
90 }; | |
91 | |
92 /////////////////////////////////////////////////////////////////////////////// | |
93 // CacheLock - Automatically manage locking and unlocking, with optional | |
94 // rollback semantics | |
95 /////////////////////////////////////////////////////////////////////////////// | |
96 | |
97 class CacheLock { | |
98 public: | |
99 CacheLock(DiskCache* cache, const std::string& id, bool rollback = false) | |
100 : cache_(cache), id_(id), rollback_(rollback) | |
101 { | |
102 locked_ = cache_->LockResource(id_); | |
103 } | |
104 ~CacheLock() { | |
105 if (locked_) { | |
106 cache_->UnlockResource(id_); | |
107 if (rollback_) { | |
108 cache_->DeleteResource(id_); | |
109 } | |
110 } | |
111 } | |
112 bool IsLocked() const { return locked_; } | |
113 void Commit() { rollback_ = false; } | |
114 | |
115 private: | |
116 DiskCache* cache_; | |
117 std::string id_; | |
118 bool rollback_, locked_; | |
119 }; | |
120 | |
121 /////////////////////////////////////////////////////////////////////////////// | |
122 | |
123 } // namespace rtc | |
124 | |
125 #endif // WEBRTC_BASE_DISKCACHE_H__ | |
OLD | NEW |