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