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 }