Mercurial > hg > orthanc-stone
comparison Framework/Loaders/LoaderCache.cpp @ 1001:e704a53c9d0a
LoaderCache : support for the second set of structure set handling classes
author | Benjamin Golinvaux <bgo@osimis.io> |
---|---|
date | Fri, 20 Sep 2019 11:59:54 +0200 |
parents | d358593820b8 |
children | 29f5f2031310 |
comparison
equal
deleted
inserted
replaced
1000:50e5acf5553b | 1001:e704a53c9d0a |
---|---|
21 #include "LoaderCache.h" | 21 #include "LoaderCache.h" |
22 | 22 |
23 #include "OrthancSeriesVolumeProgressiveLoader.h" | 23 #include "OrthancSeriesVolumeProgressiveLoader.h" |
24 #include "OrthancMultiframeVolumeLoader.h" | 24 #include "OrthancMultiframeVolumeLoader.h" |
25 #include "DicomStructureSetLoader.h" | 25 #include "DicomStructureSetLoader.h" |
26 #include "DicomStructureSetLoader2.h" | |
26 | 27 |
27 #if ORTHANC_ENABLE_WASM == 1 | 28 #if ORTHANC_ENABLE_WASM == 1 |
28 # include <unistd.h> | 29 # include <unistd.h> |
29 # include "../Oracle/WebAssemblyOracle.h" | 30 # include "../Oracle/WebAssemblyOracle.h" |
30 #else | 31 #else |
31 # include "../Oracle/ThreadedOracle.h" | 32 # include "../Oracle/ThreadedOracle.h" |
32 #endif | 33 #endif |
33 | 34 |
34 #include "../Messages/LockingEmitter.h" | 35 #include "../Messages/LockingEmitter.h" |
36 #include "../Toolbox/DicomStructureSet2.h" | |
35 #include "../Volumes/DicomVolumeImage.h" | 37 #include "../Volumes/DicomVolumeImage.h" |
36 #include "../Volumes/DicomVolumeImageMPRSlicer.h" | 38 #include "../Volumes/DicomVolumeImageMPRSlicer.h" |
39 #include "../Volumes/DicomStructureSetSlicer2.h" | |
37 | 40 |
38 #include <Core/OrthancException.h> | 41 #include <Core/OrthancException.h> |
39 #include <Core/Toolbox.h> | 42 #include <Core/Toolbox.h> |
40 | 43 |
41 namespace OrthancStone | 44 namespace OrthancStone |
182 LOG(ERROR) << "Unknown exception in LoaderCache"; | 185 LOG(ERROR) << "Unknown exception in LoaderCache"; |
183 throw; | 186 throw; |
184 } | 187 } |
185 } | 188 } |
186 | 189 |
190 boost::shared_ptr<DicomStructureSetSlicer2> LoaderCache::GetDicomStructureSetSlicer2(std::string instanceUuid) | |
191 { | |
192 // if the loader is not available, let's trigger its creation | |
193 if (dicomStructureSetSlicers2_.find(instanceUuid) == dicomStructureSetSlicers2_.end()) | |
194 { | |
195 GetDicomStructureSetLoader2(instanceUuid); | |
196 } | |
197 ORTHANC_ASSERT(dicomStructureSetSlicers2_.find(instanceUuid) != dicomStructureSetSlicers2_.end()); | |
198 | |
199 return dicomStructureSetSlicers2_[instanceUuid]; | |
200 } | |
201 | |
187 boost::shared_ptr<DicomStructureSetLoader> LoaderCache::GetDicomStructureSetLoader(std::string instanceUuid) | 202 boost::shared_ptr<DicomStructureSetLoader> LoaderCache::GetDicomStructureSetLoader(std::string instanceUuid) |
188 { | 203 { |
189 try | 204 try |
190 { | 205 { |
191 // normalize keys a little | 206 // normalize keys a little |
232 LOG(ERROR) << "Unknown exception in LoaderCache"; | 247 LOG(ERROR) << "Unknown exception in LoaderCache"; |
233 throw; | 248 throw; |
234 } | 249 } |
235 } | 250 } |
236 | 251 |
252 | |
253 boost::shared_ptr<DicomStructureSetLoader2> LoaderCache::GetDicomStructureSetLoader2(std::string instanceUuid) | |
254 { | |
255 try | |
256 { | |
257 // normalize keys a little | |
258 instanceUuid = Orthanc::Toolbox::StripSpaces(instanceUuid); | |
259 Orthanc::Toolbox::ToLowerCase(instanceUuid); | |
260 | |
261 // find in cache | |
262 if (dicomStructureSetLoaders2_.find(instanceUuid) == dicomStructureSetLoaders2_.end()) | |
263 { | |
264 boost::shared_ptr<DicomStructureSetLoader2> loader; | |
265 boost::shared_ptr<DicomStructureSet2> structureSet(new DicomStructureSet2()); | |
266 boost::shared_ptr<DicomStructureSetSlicer2> rtSlicer(new DicomStructureSetSlicer2(structureSet)); | |
267 dicomStructureSetSlicers2_[instanceUuid] = rtSlicer; | |
268 dicomStructureSets2_[instanceUuid] = structureSet; // to prevent it from being deleted | |
269 { | |
270 #if ORTHANC_ENABLE_WASM == 1 | |
271 loader.reset(new DicomStructureSetLoader2(*(structureSet.get()), oracle_, oracle_)); | |
272 #else | |
273 LockingEmitter::WriterLock lock(lockingEmitter_); | |
274 // TODO: clarify lifetimes... this is DANGEROUS! | |
275 loader.reset(new DicomStructureSetLoader2(*(structureSet.get()), oracle_, lock.GetOracleObservable())); | |
276 #endif | |
277 loader->LoadInstance(instanceUuid); | |
278 } | |
279 dicomStructureSetLoaders2_[instanceUuid] = loader; | |
280 } | |
281 return dicomStructureSetLoaders2_[instanceUuid]; | |
282 } | |
283 catch (const Orthanc::OrthancException& e) | |
284 { | |
285 if (e.HasDetails()) | |
286 { | |
287 LOG(ERROR) << "OrthancException in GetDicomStructureSetLoader2: " << e.What() << " Details: " << e.GetDetails(); | |
288 } | |
289 else | |
290 { | |
291 LOG(ERROR) << "OrthancException in GetDicomStructureSetLoader2: " << e.What(); | |
292 } | |
293 throw; | |
294 } | |
295 catch (const std::exception& e) | |
296 { | |
297 LOG(ERROR) << "std::exception in GetDicomStructureSetLoader2: " << e.what(); | |
298 throw; | |
299 } | |
300 catch (...) | |
301 { | |
302 LOG(ERROR) << "Unknown exception in GetDicomStructureSetLoader2"; | |
303 throw; | |
304 } | |
305 } | |
237 | 306 |
238 void LoaderCache::ClearCache() | 307 void LoaderCache::ClearCache() |
239 { | 308 { |
240 #if ORTHANC_ENABLE_WASM != 1 | 309 #if ORTHANC_ENABLE_WASM != 1 |
241 LockingEmitter::WriterLock lock(lockingEmitter_); | 310 LockingEmitter::WriterLock lock(lockingEmitter_); |
247 //#endif | 316 //#endif |
248 seriesVolumeProgressiveLoaders_.clear(); | 317 seriesVolumeProgressiveLoaders_.clear(); |
249 multiframeVolumeLoaders_.clear(); | 318 multiframeVolumeLoaders_.clear(); |
250 dicomVolumeImageMPRSlicers_.clear(); | 319 dicomVolumeImageMPRSlicers_.clear(); |
251 dicomStructureSetLoaders_.clear(); | 320 dicomStructureSetLoaders_.clear(); |
252 } | 321 |
253 | 322 // order is important! |
323 dicomStructureSetLoaders2_.clear(); | |
324 dicomStructureSetSlicers2_.clear(); | |
325 dicomStructureSets2_.clear(); | |
326 } | |
254 | 327 |
255 template<typename T> void DebugDisplayObjRefCountsInMap( | 328 template<typename T> void DebugDisplayObjRefCountsInMap( |
256 const std::string& name, const std::map<std::string, boost::shared_ptr<T> >& myMap) | 329 const std::string& name, const std::map<std::string, boost::shared_ptr<T> >& myMap) |
257 { | 330 { |
258 LOG(TRACE) << "Map \"" << name << "\" ref counts:"; | 331 LOG(TRACE) << "Map \"" << name << "\" ref counts:"; |
269 { | 342 { |
270 DebugDisplayObjRefCountsInMap("seriesVolumeProgressiveLoaders_", seriesVolumeProgressiveLoaders_); | 343 DebugDisplayObjRefCountsInMap("seriesVolumeProgressiveLoaders_", seriesVolumeProgressiveLoaders_); |
271 DebugDisplayObjRefCountsInMap("multiframeVolumeLoaders_", multiframeVolumeLoaders_); | 344 DebugDisplayObjRefCountsInMap("multiframeVolumeLoaders_", multiframeVolumeLoaders_); |
272 DebugDisplayObjRefCountsInMap("dicomVolumeImageMPRSlicers_", dicomVolumeImageMPRSlicers_); | 345 DebugDisplayObjRefCountsInMap("dicomVolumeImageMPRSlicers_", dicomVolumeImageMPRSlicers_); |
273 DebugDisplayObjRefCountsInMap("dicomStructureSetLoaders_", dicomStructureSetLoaders_); | 346 DebugDisplayObjRefCountsInMap("dicomStructureSetLoaders_", dicomStructureSetLoaders_); |
347 DebugDisplayObjRefCountsInMap("dicomStructureSetLoaders2_", dicomStructureSetLoaders2_); | |
348 DebugDisplayObjRefCountsInMap("dicomStructureSetSlicers2_", dicomStructureSetSlicers2_); | |
274 } | 349 } |
275 } | 350 } |