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