Mercurial > hg > orthanc-stone
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 |