comparison Framework/Deprecated/Loaders/LoaderCache.cpp @ 1310:9bea7e15b519 broker

- first pass at changes to cope with the refactoring of the loading system - global loader-related data accessible through ILoadersContext::ILock - many changes in legacy loaders (CT, RTSTRUCT, DOSE) + loader cache - NOT FINISHED! there are shared_from_this calls in ctors! this will crash!
author Benjamin Golinvaux <bgo@osimis.io>
date Mon, 09 Mar 2020 14:53:22 +0100
parents 7ec8fea061b9
children 9b126de2cde2
comparison
equal deleted inserted replaced
1309:1f877e0846fe 1310:9bea7e15b519
23 #include "../../StoneException.h" 23 #include "../../StoneException.h"
24 #include "OrthancSeriesVolumeProgressiveLoader.h" 24 #include "OrthancSeriesVolumeProgressiveLoader.h"
25 #include "OrthancMultiframeVolumeLoader.h" 25 #include "OrthancMultiframeVolumeLoader.h"
26 #include "DicomStructureSetLoader.h" 26 #include "DicomStructureSetLoader.h"
27 27
28 #include "../../Loaders/ILoadersContext.h"
29
30
28 #ifdef BGO_ENABLE_DICOMSTRUCTURESETLOADER2 31 #ifdef BGO_ENABLE_DICOMSTRUCTURESETLOADER2
29 #include "DicomStructureSetLoader2.h" 32 #include "DicomStructureSetLoader2.h"
30 #endif 33 #endif
31 //BGO_ENABLE_DICOMSTRUCTURESETLOADER2 34 //BGO_ENABLE_DICOMSTRUCTURESETLOADER2
32 35
54 #include <Core/OrthancException.h> 57 #include <Core/OrthancException.h>
55 #include <Core/Toolbox.h> 58 #include <Core/Toolbox.h>
56 59
57 namespace Deprecated 60 namespace Deprecated
58 { 61 {
59 #if ORTHANC_ENABLE_WASM == 1 62 LoaderCache::LoaderCache(OrthancStone::ILoadersContext& loadersContext)
60 LoaderCache::LoaderCache(OrthancStone::WebAssemblyOracle& oracle) 63 : loadersContext_(loadersContext)
61 : oracle_(oracle) 64 {
62 { 65
63 66 }
64 }
65 #else
66 LoaderCache::LoaderCache(OrthancStone::ThreadedOracle& oracle,
67 LockingEmitter& lockingEmitter)
68 : oracle_(oracle)
69 , lockingEmitter_(lockingEmitter)
70 {
71 }
72 #endif
73 67
74 boost::shared_ptr<OrthancSeriesVolumeProgressiveLoader> 68 boost::shared_ptr<OrthancSeriesVolumeProgressiveLoader>
75 LoaderCache::GetSeriesVolumeProgressiveLoader(std::string seriesUuid) 69 LoaderCache::GetSeriesVolumeProgressiveLoader(std::string seriesUuid)
76 { 70 {
77 try 71 try
82 Orthanc::Toolbox::ToLowerCase(seriesUuid); 76 Orthanc::Toolbox::ToLowerCase(seriesUuid);
83 77
84 // find in cache 78 // find in cache
85 if (seriesVolumeProgressiveLoaders_.find(seriesUuid) == seriesVolumeProgressiveLoaders_.end()) 79 if (seriesVolumeProgressiveLoaders_.find(seriesUuid) == seriesVolumeProgressiveLoaders_.end())
86 { 80 {
87 // LOG(TRACE) << "LoaderCache::GetSeriesVolumeProgressiveLoader : CACHEMISS --> need to load seriesUUid = " << seriesUuid; 81 std::unique_ptr<OrthancStone::ILoadersContext::ILock> lock(loadersContext_.Lock());
88 #if ORTHANC_ENABLE_WASM == 1 82
89 // LOG(TRACE) << "Performing request for series " << seriesUuid << " sbrk(0) = " << sbrk(0);
90 #else
91 // LOG(TRACE) << "Performing request for series " << seriesUuid;
92 #endif
93 boost::shared_ptr<OrthancStone::DicomVolumeImage> volumeImage(new OrthancStone::DicomVolumeImage); 83 boost::shared_ptr<OrthancStone::DicomVolumeImage> volumeImage(new OrthancStone::DicomVolumeImage);
94 boost::shared_ptr<OrthancSeriesVolumeProgressiveLoader> loader; 84 boost::shared_ptr<OrthancSeriesVolumeProgressiveLoader> loader;
95 // LOG(TRACE) << "volumeImage = " << volumeImage.get(); 85
96 { 86 loader.reset(new OrthancSeriesVolumeProgressiveLoader(loadersContext_, volumeImage));
97 #if ORTHANC_ENABLE_WASM == 1 87 loader->LoadSeries(seriesUuid);
98 loader.reset(new OrthancSeriesVolumeProgressiveLoader(volumeImage, oracle_, oracle_));
99 #else
100 LockingEmitter::WriterLock lock(lockingEmitter_);
101 loader.reset(new OrthancSeriesVolumeProgressiveLoader(volumeImage, oracle_, lock.GetOracleObservable()));
102 #endif
103 // LOG(TRACE) << "LoaderCache::GetSeriesVolumeProgressiveLoader : loader = " << loader.get();
104 loader->LoadSeries(seriesUuid);
105 // LOG(TRACE) << "LoaderCache::GetSeriesVolumeProgressiveLoader : loader->LoadSeries successful";
106 }
107 seriesVolumeProgressiveLoaders_[seriesUuid] = loader; 88 seriesVolumeProgressiveLoaders_[seriesUuid] = loader;
108 } 89 }
109 else 90 else
110 { 91 {
111 // LOG(TRACE) << "LoaderCache::GetSeriesVolumeProgressiveLoader : returning cached loader for seriesUUid = " << seriesUuid; 92 // LOG(TRACE) << "LoaderCache::GetSeriesVolumeProgressiveLoader : returning cached loader for seriesUUid = " << seriesUuid;
157 Orthanc::Toolbox::ToLowerCase(instanceUuid); 138 Orthanc::Toolbox::ToLowerCase(instanceUuid);
158 139
159 // find in cache 140 // find in cache
160 if (dicomVolumeImageMPRSlicers_.find(instanceUuid) == dicomVolumeImageMPRSlicers_.end()) 141 if (dicomVolumeImageMPRSlicers_.find(instanceUuid) == dicomVolumeImageMPRSlicers_.end())
161 { 142 {
143 std::unique_ptr<OrthancStone::ILoadersContext::ILock> lock(loadersContext_.Lock());
162 boost::shared_ptr<OrthancStone::DicomVolumeImage> volumeImage(new OrthancStone::DicomVolumeImage); 144 boost::shared_ptr<OrthancStone::DicomVolumeImage> volumeImage(new OrthancStone::DicomVolumeImage);
163 boost::shared_ptr<OrthancMultiframeVolumeLoader> loader; 145 boost::shared_ptr<OrthancMultiframeVolumeLoader> loader;
164
165 { 146 {
166 #if ORTHANC_ENABLE_WASM == 1 147 loader.reset(new OrthancMultiframeVolumeLoader(loadersContext_, volumeImage));
167 loader.reset(new OrthancMultiframeVolumeLoader(volumeImage, oracle_, oracle_));
168 #else
169 LockingEmitter::WriterLock lock(lockingEmitter_);
170 loader.reset(new OrthancMultiframeVolumeLoader(volumeImage, oracle_, lock.GetOracleObservable()));
171 #endif
172 loader->LoadInstance(instanceUuid); 148 loader->LoadInstance(instanceUuid);
173 } 149 }
174 multiframeVolumeLoaders_[instanceUuid] = loader; 150 multiframeVolumeLoaders_[instanceUuid] = loader;
175 boost::shared_ptr<OrthancStone::DicomVolumeImageMPRSlicer> mprSlicer(new OrthancStone::DicomVolumeImageMPRSlicer(volumeImage)); 151 boost::shared_ptr<OrthancStone::DicomVolumeImageMPRSlicer> mprSlicer(new OrthancStone::DicomVolumeImageMPRSlicer(volumeImage));
176 dicomVolumeImageMPRSlicers_[instanceUuid] = mprSlicer; 152 dicomVolumeImageMPRSlicers_[instanceUuid] = mprSlicer;
259 std::string entryKey = inInstanceUuid + "_" + initiallyVisibleStructuresKey; 235 std::string entryKey = inInstanceUuid + "_" + initiallyVisibleStructuresKey;
260 236
261 // find in cache 237 // find in cache
262 if (dicomStructureSetLoaders_.find(entryKey) == dicomStructureSetLoaders_.end()) 238 if (dicomStructureSetLoaders_.find(entryKey) == dicomStructureSetLoaders_.end())
263 { 239 {
240 std::unique_ptr<OrthancStone::ILoadersContext::ILock> lock(loadersContext_.Lock());
241
264 boost::shared_ptr<DicomStructureSetLoader> loader; 242 boost::shared_ptr<DicomStructureSetLoader> loader;
265
266 { 243 {
267 #if ORTHANC_ENABLE_WASM == 1 244 loader.reset(new DicomStructureSetLoader(loadersContext_));
268 loader.reset(new DicomStructureSetLoader(oracle_, oracle_));
269 #else
270 LockingEmitter::WriterLock lock(lockingEmitter_);
271 loader.reset(new DicomStructureSetLoader(oracle_, lock.GetOracleObservable()));
272 #endif
273 loader->LoadInstance(inInstanceUuid, initiallyVisibleStructures); 245 loader->LoadInstance(inInstanceUuid, initiallyVisibleStructures);
274 } 246 }
275 dicomStructureSetLoaders_[entryKey] = loader; 247 dicomStructureSetLoaders_[entryKey] = loader;
276 } 248 }
277 return dicomStructureSetLoaders_[entryKey]; 249 return dicomStructureSetLoaders_[entryKey];
360 // BGO_ENABLE_DICOMSTRUCTURESETLOADER2 332 // BGO_ENABLE_DICOMSTRUCTURESETLOADER2
361 333
362 334
363 void LoaderCache::ClearCache() 335 void LoaderCache::ClearCache()
364 { 336 {
365 #if ORTHANC_ENABLE_WASM != 1 337 std::unique_ptr<OrthancStone::ILoadersContext::ILock> lock(loadersContext_.Lock());
366 LockingEmitter::WriterLock lock(lockingEmitter_);
367 #endif
368 338
369 //#ifndef NDEBUG 339 #ifndef NDEBUG
370 // ISO way of checking for debug builds 340 // ISO way of checking for debug builds
371 DebugDisplayObjRefCounts(); 341 DebugDisplayObjRefCounts();
372 //#endif 342 #endif
373 seriesVolumeProgressiveLoaders_.clear(); 343 seriesVolumeProgressiveLoaders_.clear();
374 multiframeVolumeLoaders_.clear(); 344 multiframeVolumeLoaders_.clear();
375 dicomVolumeImageMPRSlicers_.clear(); 345 dicomVolumeImageMPRSlicers_.clear();
376 dicomStructureSetLoaders_.clear(); 346 dicomStructureSetLoaders_.clear();
377 347