Mercurial > hg > orthanc-webviewer
annotate Plugin/Cache/CacheScheduler.cpp @ 321:705be6d59d9b default tip
fix build on tumbleweed
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Tue, 11 Jun 2024 12:57:30 +0200 |
parents | 553fa466835a |
children |
rev | line source |
---|---|
0 | 1 /** |
2 * Orthanc - A Lightweight, RESTful DICOM Store | |
122 | 3 * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics |
0 | 4 * Department, University Hospital of Liege, Belgium |
320
553fa466835a
updated copyright, as Orthanc Team now replaces Osimis
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
316
diff
changeset
|
5 * Copyright (C) 2017-2023 Osimis S.A., Belgium |
553fa466835a
updated copyright, as Orthanc Team now replaces Osimis
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
316
diff
changeset
|
6 * Copyright (C) 2024-2024 Orthanc Team SRL, Belgium |
314
0a1ad7492050
update year to 2024
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
303
diff
changeset
|
7 * Copyright (C) 2021-2024 Sebastien Jodogne, ICTEAM UCLouvain, Belgium |
0 | 8 * |
9 * This program is free software: you can redistribute it and/or | |
10 * modify it under the terms of the GNU Affero General Public License | |
11 * as published by the Free Software Foundation, either version 3 of | |
12 * the License, or (at your option) any later version. | |
13 * | |
14 * This program is distributed in the hope that it will be useful, but | |
15 * WITHOUT ANY WARRANTY; without even the implied warranty of | |
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
17 * Affero General Public License for more details. | |
18 * | |
19 * You should have received a copy of the GNU Affero General Public License | |
20 * along with this program. If not, see <http://www.gnu.org/licenses/>. | |
21 **/ | |
22 | |
23 | |
24 #include "CacheScheduler.h" | |
25 | |
26 #include "CacheIndex.h" | |
27 | |
266
4e9d30c19b4b
linking against orthanc framework library
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
226
diff
changeset
|
28 #include <Compatibility.h> |
4e9d30c19b4b
linking against orthanc framework library
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
226
diff
changeset
|
29 #include <OrthancException.h> |
0 | 30 #include <stdio.h> |
31 | |
32 namespace OrthancPlugins | |
33 { | |
34 class DynamicString : public Orthanc::IDynamicObject | |
35 { | |
36 private: | |
37 std::string value_; | |
38 | |
39 public: | |
197 | 40 explicit DynamicString(const std::string& value) : value_(value) |
0 | 41 { |
42 } | |
43 | |
44 const std::string& GetValue() const | |
45 { | |
46 return value_; | |
47 } | |
48 }; | |
49 | |
50 | |
51 class CacheScheduler::PrefetchQueue : public boost::noncopyable | |
52 { | |
53 private: | |
54 boost::mutex mutex_; | |
55 Orthanc::SharedMessageQueue queue_; | |
56 std::set<std::string> content_; | |
57 | |
58 public: | |
197 | 59 explicit PrefetchQueue(size_t maxSize) : queue_(maxSize) |
0 | 60 { |
61 queue_.SetLifoPolicy(); | |
62 } | |
63 | |
64 void Enqueue(const std::string& item) | |
65 { | |
66 boost::mutex::scoped_lock lock(mutex_); | |
67 | |
68 if (content_.find(item) != content_.end()) | |
69 { | |
70 // This cache index is already pending in the queue | |
71 return; | |
72 } | |
73 | |
74 content_.insert(item); | |
75 queue_.Enqueue(new DynamicString(item)); | |
76 } | |
77 | |
78 DynamicString* Dequeue(int32_t msTimeout) | |
79 { | |
266
4e9d30c19b4b
linking against orthanc framework library
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
226
diff
changeset
|
80 std::unique_ptr<Orthanc::IDynamicObject> message(queue_.Dequeue(msTimeout)); |
0 | 81 if (message.get() == NULL) |
82 { | |
83 return NULL; | |
84 } | |
85 | |
86 const DynamicString& index = dynamic_cast<const DynamicString&>(*message); | |
87 | |
88 { | |
89 boost::mutex::scoped_lock lock(mutex_); | |
90 content_.erase(index.GetValue()); | |
91 } | |
92 | |
93 return dynamic_cast<DynamicString*>(message.release()); | |
94 } | |
95 }; | |
96 | |
97 | |
98 class CacheScheduler::Prefetcher : public boost::noncopyable | |
99 { | |
100 private: | |
101 int bundleIndex_; | |
102 ICacheFactory& factory_; | |
103 CacheManager& cache_; | |
104 boost::mutex& cacheMutex_; | |
105 PrefetchQueue& queue_; | |
106 | |
107 bool done_; | |
108 boost::thread thread_; | |
109 boost::mutex invalidatedMutex_; | |
110 bool invalidated_; | |
111 std::string prefetching_; | |
112 | |
113 static void Worker(Prefetcher* that) | |
114 { | |
115 while (!(that->done_)) | |
116 { | |
266
4e9d30c19b4b
linking against orthanc framework library
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
226
diff
changeset
|
117 std::unique_ptr<DynamicString> prefetch(that->queue_.Dequeue(500)); |
0 | 118 |
147
70d1fe6d6309
Avoid hard crash if not enough memory
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
122
diff
changeset
|
119 try |
0 | 120 { |
147
70d1fe6d6309
Avoid hard crash if not enough memory
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
122
diff
changeset
|
121 if (prefetch.get() != NULL) |
0 | 122 { |
147
70d1fe6d6309
Avoid hard crash if not enough memory
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
122
diff
changeset
|
123 { |
70d1fe6d6309
Avoid hard crash if not enough memory
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
122
diff
changeset
|
124 boost::mutex::scoped_lock lock(that->invalidatedMutex_); |
70d1fe6d6309
Avoid hard crash if not enough memory
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
122
diff
changeset
|
125 that->invalidated_ = false; |
70d1fe6d6309
Avoid hard crash if not enough memory
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
122
diff
changeset
|
126 that->prefetching_ = prefetch->GetValue(); |
70d1fe6d6309
Avoid hard crash if not enough memory
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
122
diff
changeset
|
127 } |
70d1fe6d6309
Avoid hard crash if not enough memory
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
122
diff
changeset
|
128 |
70d1fe6d6309
Avoid hard crash if not enough memory
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
122
diff
changeset
|
129 { |
70d1fe6d6309
Avoid hard crash if not enough memory
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
122
diff
changeset
|
130 boost::mutex::scoped_lock lock(that->cacheMutex_); |
70d1fe6d6309
Avoid hard crash if not enough memory
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
122
diff
changeset
|
131 if (that->cache_.IsCached(that->bundleIndex_, prefetch->GetValue())) |
70d1fe6d6309
Avoid hard crash if not enough memory
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
122
diff
changeset
|
132 { |
70d1fe6d6309
Avoid hard crash if not enough memory
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
122
diff
changeset
|
133 // This item is already cached |
70d1fe6d6309
Avoid hard crash if not enough memory
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
122
diff
changeset
|
134 continue; |
70d1fe6d6309
Avoid hard crash if not enough memory
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
122
diff
changeset
|
135 } |
70d1fe6d6309
Avoid hard crash if not enough memory
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
122
diff
changeset
|
136 } |
70d1fe6d6309
Avoid hard crash if not enough memory
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
122
diff
changeset
|
137 |
70d1fe6d6309
Avoid hard crash if not enough memory
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
122
diff
changeset
|
138 std::string content; |
0 | 139 |
147
70d1fe6d6309
Avoid hard crash if not enough memory
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
122
diff
changeset
|
140 try |
70d1fe6d6309
Avoid hard crash if not enough memory
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
122
diff
changeset
|
141 { |
70d1fe6d6309
Avoid hard crash if not enough memory
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
122
diff
changeset
|
142 if (!that->factory_.Create(content, prefetch->GetValue())) |
70d1fe6d6309
Avoid hard crash if not enough memory
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
122
diff
changeset
|
143 { |
70d1fe6d6309
Avoid hard crash if not enough memory
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
122
diff
changeset
|
144 // The factory cannot generate this item |
70d1fe6d6309
Avoid hard crash if not enough memory
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
122
diff
changeset
|
145 continue; |
70d1fe6d6309
Avoid hard crash if not enough memory
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
122
diff
changeset
|
146 } |
70d1fe6d6309
Avoid hard crash if not enough memory
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
122
diff
changeset
|
147 } |
70d1fe6d6309
Avoid hard crash if not enough memory
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
122
diff
changeset
|
148 catch (...) |
0 | 149 { |
147
70d1fe6d6309
Avoid hard crash if not enough memory
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
122
diff
changeset
|
150 // Exception |
0 | 151 continue; |
152 } | |
147
70d1fe6d6309
Avoid hard crash if not enough memory
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
122
diff
changeset
|
153 |
70d1fe6d6309
Avoid hard crash if not enough memory
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
122
diff
changeset
|
154 { |
70d1fe6d6309
Avoid hard crash if not enough memory
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
122
diff
changeset
|
155 boost::mutex::scoped_lock lock(that->invalidatedMutex_); |
70d1fe6d6309
Avoid hard crash if not enough memory
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
122
diff
changeset
|
156 if (that->invalidated_) |
70d1fe6d6309
Avoid hard crash if not enough memory
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
122
diff
changeset
|
157 { |
70d1fe6d6309
Avoid hard crash if not enough memory
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
122
diff
changeset
|
158 // This item has been invalidated |
70d1fe6d6309
Avoid hard crash if not enough memory
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
122
diff
changeset
|
159 continue; |
70d1fe6d6309
Avoid hard crash if not enough memory
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
122
diff
changeset
|
160 } |
70d1fe6d6309
Avoid hard crash if not enough memory
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
122
diff
changeset
|
161 |
70d1fe6d6309
Avoid hard crash if not enough memory
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
122
diff
changeset
|
162 { |
70d1fe6d6309
Avoid hard crash if not enough memory
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
122
diff
changeset
|
163 boost::mutex::scoped_lock lock2(that->cacheMutex_); |
70d1fe6d6309
Avoid hard crash if not enough memory
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
122
diff
changeset
|
164 that->cache_.Store(that->bundleIndex_, prefetch->GetValue(), content); |
70d1fe6d6309
Avoid hard crash if not enough memory
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
122
diff
changeset
|
165 } |
70d1fe6d6309
Avoid hard crash if not enough memory
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
122
diff
changeset
|
166 } |
0 | 167 } |
147
70d1fe6d6309
Avoid hard crash if not enough memory
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
122
diff
changeset
|
168 } |
70d1fe6d6309
Avoid hard crash if not enough memory
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
122
diff
changeset
|
169 catch (std::bad_alloc&) |
70d1fe6d6309
Avoid hard crash if not enough memory
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
122
diff
changeset
|
170 { |
70d1fe6d6309
Avoid hard crash if not enough memory
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
122
diff
changeset
|
171 OrthancPluginLogError(that->cache_.GetPluginContext(), |
70d1fe6d6309
Avoid hard crash if not enough memory
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
122
diff
changeset
|
172 "Not enough memory for the prefetcher of the Web viewer to work"); |
70d1fe6d6309
Avoid hard crash if not enough memory
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
122
diff
changeset
|
173 } |
70d1fe6d6309
Avoid hard crash if not enough memory
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
122
diff
changeset
|
174 catch (...) |
70d1fe6d6309
Avoid hard crash if not enough memory
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
122
diff
changeset
|
175 { |
70d1fe6d6309
Avoid hard crash if not enough memory
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
122
diff
changeset
|
176 OrthancPluginLogError(that->cache_.GetPluginContext(), |
70d1fe6d6309
Avoid hard crash if not enough memory
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
122
diff
changeset
|
177 "Unhandled native exception inside the prefetcher of the Web viewer"); |
0 | 178 } |
179 } | |
180 } | |
181 | |
182 | |
183 public: | |
184 Prefetcher(int bundleIndex, | |
185 ICacheFactory& factory, | |
186 CacheManager& cache, | |
187 boost::mutex& cacheMutex, | |
188 PrefetchQueue& queue) : | |
189 bundleIndex_(bundleIndex), | |
190 factory_(factory), | |
191 cache_(cache), | |
192 cacheMutex_(cacheMutex), | |
193 queue_(queue) | |
194 { | |
195 done_ = false; | |
196 thread_ = boost::thread(Worker, this); | |
197 } | |
198 | |
199 ~Prefetcher() | |
200 { | |
201 done_ = true; | |
202 if (thread_.joinable()) | |
203 { | |
204 thread_.join(); | |
205 } | |
206 } | |
207 | |
208 void SignalInvalidated(const std::string& item) | |
209 { | |
210 boost::mutex::scoped_lock lock(invalidatedMutex_); | |
211 | |
212 if (prefetching_ == item) | |
213 { | |
214 invalidated_ = true; | |
215 } | |
216 } | |
217 }; | |
218 | |
219 | |
220 | |
221 class CacheScheduler::BundleScheduler | |
222 { | |
223 private: | |
266
4e9d30c19b4b
linking against orthanc framework library
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
226
diff
changeset
|
224 std::unique_ptr<ICacheFactory> factory_; |
4e9d30c19b4b
linking against orthanc framework library
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
226
diff
changeset
|
225 PrefetchQueue queue_; |
4e9d30c19b4b
linking against orthanc framework library
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
226
diff
changeset
|
226 std::vector<Prefetcher*> prefetchers_; |
0 | 227 |
228 public: | |
229 BundleScheduler(int bundleIndex, | |
230 ICacheFactory* factory, | |
231 CacheManager& cache, | |
232 boost::mutex& cacheMutex, | |
233 size_t numThreads, | |
234 size_t queueSize) : | |
235 factory_(factory), | |
236 queue_(queueSize) | |
237 { | |
238 prefetchers_.resize(numThreads, NULL); | |
239 | |
240 for (size_t i = 0; i < numThreads; i++) | |
241 { | |
242 prefetchers_[i] = new Prefetcher(bundleIndex, *factory_, cache, cacheMutex, queue_); | |
243 } | |
244 } | |
245 | |
246 ~BundleScheduler() | |
247 { | |
248 for (size_t i = 0; i < prefetchers_.size(); i++) | |
249 { | |
250 if (prefetchers_[i] != NULL) | |
251 delete prefetchers_[i]; | |
252 } | |
253 } | |
254 | |
255 void Invalidate(const std::string& item) | |
256 { | |
257 for (size_t i = 0; i < prefetchers_.size(); i++) | |
258 { | |
259 prefetchers_[i]->SignalInvalidated(item); | |
260 } | |
261 } | |
262 | |
263 void Prefetch(const std::string& item) | |
264 { | |
265 queue_.Enqueue(item); | |
266 } | |
267 | |
268 bool CallFactory(std::string& content, | |
269 const std::string& item) | |
270 { | |
271 content.clear(); | |
272 return factory_->Create(content, item); | |
273 } | |
96 | 274 |
275 ICacheFactory& GetFactory() | |
276 { | |
277 return *factory_; | |
278 } | |
0 | 279 }; |
280 | |
281 | |
282 | |
283 CacheScheduler::BundleScheduler& CacheScheduler::GetBundleScheduler(unsigned int bundleIndex) | |
284 { | |
285 boost::mutex::scoped_lock lock(factoryMutex_); | |
286 | |
287 BundleSchedulers::iterator it = bundles_.find(bundleIndex); | |
288 if (it == bundles_.end()) | |
289 { | |
79 | 290 // No factory associated with this bundle |
291 throw Orthanc::OrthancException(Orthanc::ErrorCode_ParameterOutOfRange); | |
0 | 292 } |
293 | |
294 return *(it->second); | |
295 } | |
296 | |
297 | |
298 | |
299 CacheScheduler::CacheScheduler(CacheManager& cache, | |
300 unsigned int maxPrefetchSize) : | |
301 maxPrefetchSize_(maxPrefetchSize), | |
266
4e9d30c19b4b
linking against orthanc framework library
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
226
diff
changeset
|
302 cache_(cache) |
0 | 303 { |
304 } | |
305 | |
306 | |
307 CacheScheduler::~CacheScheduler() | |
308 { | |
309 for (BundleSchedulers::iterator it = bundles_.begin(); | |
197 | 310 it != bundles_.end(); ++it) |
0 | 311 { |
312 delete it->second; | |
313 } | |
314 } | |
315 | |
316 | |
317 void CacheScheduler::Register(int bundle, | |
318 ICacheFactory* factory /* takes ownership */, | |
319 size_t numThreads) | |
320 { | |
321 boost::mutex::scoped_lock lock(factoryMutex_); | |
322 | |
323 BundleSchedulers::iterator it = bundles_.find(bundle); | |
324 if (it != bundles_.end()) | |
325 { | |
326 // This bundle is already registered | |
327 throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); | |
328 } | |
329 | |
330 bundles_[bundle] = new BundleScheduler(bundle, factory, cache_, cacheMutex_, numThreads, maxPrefetchSize_); | |
331 } | |
332 | |
333 | |
4
ecefd45026bf
configuration of the cache
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
334 void CacheScheduler::SetQuota(int bundle, |
ecefd45026bf
configuration of the cache
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
335 uint32_t maxCount, |
ecefd45026bf
configuration of the cache
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
336 uint64_t maxSpace) |
ecefd45026bf
configuration of the cache
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
337 { |
ecefd45026bf
configuration of the cache
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
338 boost::mutex::scoped_lock lock(cacheMutex_); |
ecefd45026bf
configuration of the cache
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
339 cache_.SetBundleQuota(bundle, maxCount, maxSpace); |
ecefd45026bf
configuration of the cache
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
340 } |
ecefd45026bf
configuration of the cache
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
341 |
ecefd45026bf
configuration of the cache
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
0
diff
changeset
|
342 |
0 | 343 void CacheScheduler::Invalidate(int bundle, |
344 const std::string& item) | |
345 { | |
346 { | |
347 boost::mutex::scoped_lock lock(cacheMutex_); | |
348 cache_.Invalidate(bundle, item); | |
349 } | |
350 | |
351 GetBundleScheduler(bundle).Invalidate(item); | |
352 } | |
353 | |
354 | |
355 void CacheScheduler::ApplyPrefetchPolicy(int bundle, | |
356 const std::string& item, | |
357 const std::string& content) | |
358 { | |
359 boost::recursive_mutex::scoped_lock lock(policyMutex_); | |
360 | |
361 if (policy_.get() != NULL) | |
362 { | |
363 std::list<CacheIndex> toPrefetch; | |
364 | |
365 { | |
366 policy_->Apply(toPrefetch, *this, CacheIndex(bundle, item), content); | |
367 } | |
368 | |
369 for (std::list<CacheIndex>::const_reverse_iterator | |
370 it = toPrefetch.rbegin(); it != toPrefetch.rend(); ++it) | |
371 { | |
372 Prefetch(it->GetBundle(), it->GetItem()); | |
373 } | |
374 } | |
375 } | |
376 | |
377 | |
378 bool CacheScheduler::Access(std::string& content, | |
379 int bundle, | |
380 const std::string& item) | |
381 { | |
382 bool existing; | |
383 | |
384 { | |
385 boost::mutex::scoped_lock lock(cacheMutex_); | |
386 existing = cache_.Access(content, bundle, item); | |
387 } | |
388 | |
389 if (existing) | |
390 { | |
391 ApplyPrefetchPolicy(bundle, item, content); | |
392 return true; | |
393 } | |
394 | |
395 if (!GetBundleScheduler(bundle).CallFactory(content, item)) | |
396 { | |
397 // This item cannot be generated by the factory | |
398 return false; | |
399 } | |
400 | |
401 { | |
402 boost::mutex::scoped_lock lock(cacheMutex_); | |
403 cache_.Store(bundle, item, content); | |
404 } | |
405 | |
406 ApplyPrefetchPolicy(bundle, item, content); | |
407 | |
408 return true; | |
409 } | |
410 | |
411 | |
412 void CacheScheduler::Prefetch(int bundle, | |
413 const std::string& item) | |
414 { | |
415 GetBundleScheduler(bundle).Prefetch(item); | |
416 } | |
417 | |
418 | |
419 void CacheScheduler::RegisterPolicy(IPrefetchPolicy* policy) | |
420 { | |
421 boost::recursive_mutex::scoped_lock lock(policyMutex_); | |
422 policy_.reset(policy); | |
423 } | |
424 | |
96 | 425 |
426 ICacheFactory& CacheScheduler::GetFactory(int bundle) | |
427 { | |
428 return GetBundleScheduler(bundle).GetFactory(); | |
429 } | |
115
c8ca47a67bf3
automatic clearing of the cache
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
96
diff
changeset
|
430 |
c8ca47a67bf3
automatic clearing of the cache
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
96
diff
changeset
|
431 |
c8ca47a67bf3
automatic clearing of the cache
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
96
diff
changeset
|
432 void CacheScheduler::SetProperty(CacheProperty property, |
c8ca47a67bf3
automatic clearing of the cache
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
96
diff
changeset
|
433 const std::string& value) |
c8ca47a67bf3
automatic clearing of the cache
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
96
diff
changeset
|
434 { |
c8ca47a67bf3
automatic clearing of the cache
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
96
diff
changeset
|
435 boost::mutex::scoped_lock lock(cacheMutex_); |
c8ca47a67bf3
automatic clearing of the cache
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
96
diff
changeset
|
436 cache_.SetProperty(property, value); |
c8ca47a67bf3
automatic clearing of the cache
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
96
diff
changeset
|
437 } |
c8ca47a67bf3
automatic clearing of the cache
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
96
diff
changeset
|
438 |
c8ca47a67bf3
automatic clearing of the cache
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
96
diff
changeset
|
439 |
c8ca47a67bf3
automatic clearing of the cache
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
96
diff
changeset
|
440 bool CacheScheduler::LookupProperty(std::string& target, |
c8ca47a67bf3
automatic clearing of the cache
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
96
diff
changeset
|
441 CacheProperty property) |
c8ca47a67bf3
automatic clearing of the cache
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
96
diff
changeset
|
442 { |
c8ca47a67bf3
automatic clearing of the cache
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
96
diff
changeset
|
443 boost::mutex::scoped_lock lock(cacheMutex_); |
c8ca47a67bf3
automatic clearing of the cache
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
96
diff
changeset
|
444 return cache_.LookupProperty(target, property); |
c8ca47a67bf3
automatic clearing of the cache
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
96
diff
changeset
|
445 } |
c8ca47a67bf3
automatic clearing of the cache
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
96
diff
changeset
|
446 |
c8ca47a67bf3
automatic clearing of the cache
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
96
diff
changeset
|
447 |
c8ca47a67bf3
automatic clearing of the cache
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
96
diff
changeset
|
448 void CacheScheduler::Clear() |
c8ca47a67bf3
automatic clearing of the cache
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
96
diff
changeset
|
449 { |
c8ca47a67bf3
automatic clearing of the cache
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
96
diff
changeset
|
450 boost::mutex::scoped_lock lock(cacheMutex_); |
c8ca47a67bf3
automatic clearing of the cache
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
96
diff
changeset
|
451 return cache_.Clear(); |
c8ca47a67bf3
automatic clearing of the cache
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
96
diff
changeset
|
452 } |
0 | 453 } |