@@ -173,7 +173,7 @@ void dna_adjust::DeserialiseBlockFromMappedFile(const UINT32& block, const int f
173173 break ;
174174 case sf_normals_r:
175175 addr = normalsR_map_.GetBlockRegionAddr (block);
176- v_normalsR_.at (block).ReadMappedFileRegion (addr);
176+ v_normalsR_.at (block).AttachMappedFileRegion (addr);
177177 break ;
178178 case sf_atvinv:
179179 v_AtVinv_.at (block).allocate ();
@@ -183,47 +183,47 @@ void dna_adjust::DeserialiseBlockFromMappedFile(const UINT32& block, const int f
183183 break ;
184184 case sf_meas_minus_comp:
185185 addr = measMinusComp_map_.GetBlockRegionAddr (block);
186- v_measMinusComp_.at (block).ReadMappedFileRegion (addr);
186+ v_measMinusComp_.at (block).AttachMappedFileRegion (addr);
187187 break ;
188188 case sf_estimated_stns:
189189 addr = estimatedStations_map_.GetBlockRegionAddr (block);
190- v_estimatedStations_.at (block).ReadMappedFileRegion (addr);
190+ v_estimatedStations_.at (block).AttachMappedFileRegion (addr);
191191 break ;
192192 case sf_original_stns:
193193 addr = originalStations_map_.GetBlockRegionAddr (block);
194- v_originalStations_.at (block).ReadMappedFileRegion (addr);
194+ v_originalStations_.at (block).AttachMappedFileRegion (addr);
195195 break ;
196196 case sf_rigorous_stns:
197197 addr = rigorousStations_map_.GetBlockRegionAddr (block);
198- v_rigorousStations_.at (block).ReadMappedFileRegion (addr);
198+ v_rigorousStations_.at (block).AttachMappedFileRegion (addr);
199199 break ;
200200 case sf_junction_vars:
201201 addr = junctionVariances_map_.GetBlockRegionAddr (block);
202- v_junctionVariances_.at (block).ReadMappedFileRegion (addr);
202+ v_junctionVariances_.at (block).AttachMappedFileRegion (addr);
203203 break ;
204204 case sf_junction_vars_f:
205205 addr = junctionVariancesFwd_map_.GetBlockRegionAddr (block);
206- v_junctionVariancesFwd_.at (block).ReadMappedFileRegion (addr);
206+ v_junctionVariancesFwd_.at (block).AttachMappedFileRegion (addr);
207207 break ;
208208 case sf_junction_ests_f:
209209 addr = junctionEstimatesFwd_map_.GetBlockRegionAddr (block);
210- v_junctionEstimatesFwd_.at (block).ReadMappedFileRegion (addr);
210+ v_junctionEstimatesFwd_.at (block).AttachMappedFileRegion (addr);
211211 break ;
212212 case sf_junction_ests_r:
213213 addr = junctionEstimatesRev_map_.GetBlockRegionAddr (block);
214- v_junctionEstimatesRev_.at (block).ReadMappedFileRegion (addr);
214+ v_junctionEstimatesRev_.at (block).AttachMappedFileRegion (addr);
215215 break ;
216216 case sf_rigorous_vars:
217217 addr = rigorousVariances_map_.GetBlockRegionAddr (block);
218- v_rigorousVariances_.at (block).ReadMappedFileRegion (addr);
218+ v_rigorousVariances_.at (block).AttachMappedFileRegion (addr);
219219 break ;
220220 case sf_prec_adj_msrs:
221221 addr = precAdjMsrs_map_.GetBlockRegionAddr (block);
222- v_precAdjMsrsFull_.at (block).ReadMappedFileRegion (addr);
222+ v_precAdjMsrsFull_.at (block).AttachMappedFileRegion (addr);
223223 break ;
224224 case sf_corrections:
225225 addr = corrections_map_.GetBlockRegionAddr (block);
226- v_corrections_.at (block).ReadMappedFileRegion (addr);
226+ v_corrections_.at (block).AttachMappedFileRegion (addr);
227227
228228 if (v_blockMeta_.at (block)._blockLast )
229229 v_correctionsR_.at (block).allocate ();
@@ -240,8 +240,8 @@ void dna_adjust::SerialiseBlockToMappedFile(const UINT32& block, const int file_
240240 {
241241 // serialise all. That is, call this function again, but with
242242 // arguments for all files
243- SerialiseBlockToMappedFile (block, 16 ,
244- sf_normals, sf_normals_r, sf_atvinv, sf_design , sf_meas_minus_comp,
243+ SerialiseBlockToMappedFile (block, 12 ,
244+ sf_normals_r, sf_meas_minus_comp,
245245 sf_estimated_stns, sf_original_stns, sf_rigorous_stns,
246246 sf_junction_vars, sf_junction_vars_f, sf_junction_ests_f, sf_junction_ests_r,
247247 sf_rigorous_vars, sf_prec_adj_msrs, sf_corrections);
@@ -257,16 +257,10 @@ void dna_adjust::SerialiseBlockToMappedFile(const UINT32& block, const int file_
257257 {
258258 switch (va_arg (vlist, int ))
259259 {
260- case sf_normals:
261- break ;
262260 case sf_normals_r:
263261 addr = normalsR_map_.GetBlockRegionAddr (block);
264262 v_normalsR_.at (block).WriteMappedFileRegion (addr);
265263 break ;
266- case sf_atvinv:
267- break ;
268- case sf_design:
269- break ;
270264 case sf_meas_minus_comp:
271265 addr = measMinusComp_map_.GetBlockRegionAddr (block);
272266 v_measMinusComp_.at (block).WriteMappedFileRegion (addr);
@@ -395,7 +389,11 @@ void dna_adjust::OpenStageFileStreams(const int file_count, ...)
395389 }
396390
397391 std::stringstream ss;
398- ss << projectSettings_.g .output_folder << FOLDER_SLASH << projectSettings_.g .network_name << " -" ;
392+ if (projectSettings_.a .stage_path .empty ())
393+ ss << projectSettings_.g .output_folder ;
394+ else
395+ ss << projectSettings_.a .stage_path ;
396+ ss << FOLDER_SLASH << projectSettings_.g .network_name << " -" ;
399397 std::string filePath (ss.str ());
400398
401399 v_stageFileStreams_.clear ();
@@ -851,6 +849,46 @@ void dna_adjust::OffloadBlockToMappedFile(const UINT32& block)
851849
852850 // Unload block matrix data from memory
853851 UnloadBlock (block);
852+
853+ // Advise kernel that mapped pages for this block are no longer needed,
854+ // freeing page cache for upcoming blocks
855+ AdviseBlockDontNeed (block);
856+ }
857+
858+
859+ void dna_adjust::AdviseBlockDontNeed (const UINT32& block)
860+ {
861+ using advice = boost::interprocess::mapped_region::advice_types;
862+ normalsR_map_.AdviseRegion (block, advice::advice_dontneed);
863+ measMinusComp_map_.AdviseRegion (block, advice::advice_dontneed);
864+ estimatedStations_map_.AdviseRegion (block, advice::advice_dontneed);
865+ originalStations_map_.AdviseRegion (block, advice::advice_dontneed);
866+ rigorousStations_map_.AdviseRegion (block, advice::advice_dontneed);
867+ junctionVariances_map_.AdviseRegion (block, advice::advice_dontneed);
868+ junctionVariancesFwd_map_.AdviseRegion (block, advice::advice_dontneed);
869+ junctionEstimatesFwd_map_.AdviseRegion (block, advice::advice_dontneed);
870+ junctionEstimatesRev_map_.AdviseRegion (block, advice::advice_dontneed);
871+ rigorousVariances_map_.AdviseRegion (block, advice::advice_dontneed);
872+ precAdjMsrs_map_.AdviseRegion (block, advice::advice_dontneed);
873+ corrections_map_.AdviseRegion (block, advice::advice_dontneed);
874+ }
875+
876+
877+ void dna_adjust::AdviseBlockWillNeed (const UINT32& block)
878+ {
879+ using advice = boost::interprocess::mapped_region::advice_types;
880+ normalsR_map_.AdviseRegion (block, advice::advice_willneed);
881+ measMinusComp_map_.AdviseRegion (block, advice::advice_willneed);
882+ estimatedStations_map_.AdviseRegion (block, advice::advice_willneed);
883+ originalStations_map_.AdviseRegion (block, advice::advice_willneed);
884+ rigorousStations_map_.AdviseRegion (block, advice::advice_willneed);
885+ junctionVariances_map_.AdviseRegion (block, advice::advice_willneed);
886+ junctionVariancesFwd_map_.AdviseRegion (block, advice::advice_willneed);
887+ junctionEstimatesFwd_map_.AdviseRegion (block, advice::advice_willneed);
888+ junctionEstimatesRev_map_.AdviseRegion (block, advice::advice_willneed);
889+ rigorousVariances_map_.AdviseRegion (block, advice::advice_willneed);
890+ precAdjMsrs_map_.AdviseRegion (block, advice::advice_willneed);
891+ corrections_map_.AdviseRegion (block, advice::advice_willneed);
854892}
855893
856894
@@ -896,7 +934,7 @@ void dna_adjust::UnloadBlock(const UINT32& block, const int file_count, ...)
896934 if (file_count == 0 )
897935 {
898936 // deserialise all
899- UnloadBlock (block, 16 ,
937+ UnloadBlock (block, 15 ,
900938 sf_normals, sf_normals_r, sf_atvinv, sf_design, sf_meas_minus_comp,
901939 sf_estimated_stns, sf_original_stns, sf_rigorous_stns,
902940 sf_junction_vars, sf_junction_vars_f, sf_junction_ests_f, sf_junction_ests_r,
@@ -907,58 +945,60 @@ void dna_adjust::UnloadBlock(const UINT32& block, const int file_count, ...)
907945 va_list vlist;
908946 va_start (vlist, file_count);
909947
910- // Unload block matrix data from memory
948+ // Unload block matrix data from memory by freeing buffers.
949+ // Use deallocate() instead of explicit destructor calls to keep
950+ // the matrix objects in a valid state for later reuse.
911951 for (UINT16 file (0 ); file<file_count; ++file)
912952 {
913953 switch (va_arg (vlist, int ))
914954 {
915955 case sf_normals:
916- v_normals_.at (block).~matrix_2d ();
956+ v_normals_.at (block).deallocate ();
917957 break ;
918958 case sf_normals_r:
919- v_normalsR_.at (block).~matrix_2d ();
959+ v_normalsR_.at (block).deallocate ();
920960 break ;
921961 case sf_atvinv:
922- v_AtVinv_.at (block).~matrix_2d ();
962+ v_AtVinv_.at (block).deallocate ();
923963 break ;
924964 case sf_design:
925- v_design_.at (block).~matrix_2d ();
965+ v_design_.at (block).deallocate ();
926966 break ;
927967 case sf_meas_minus_comp:
928- v_measMinusComp_.at (block).~matrix_2d ();
968+ v_measMinusComp_.at (block).deallocate ();
929969 break ;
930970 case sf_estimated_stns:
931- v_estimatedStations_.at (block).~matrix_2d ();
971+ v_estimatedStations_.at (block).deallocate ();
932972 break ;
933973 case sf_original_stns:
934- v_originalStations_.at (block).~matrix_2d ();
974+ v_originalStations_.at (block).deallocate ();
935975 break ;
936976 case sf_rigorous_stns:
937- v_rigorousStations_.at (block).~matrix_2d ();
977+ v_rigorousStations_.at (block).deallocate ();
938978 break ;
939979 case sf_junction_vars:
940- v_junctionVariances_.at (block).~matrix_2d ();
980+ v_junctionVariances_.at (block).deallocate ();
941981 break ;
942982 case sf_junction_vars_f:
943- v_junctionVariancesFwd_.at (block).~matrix_2d ();
983+ v_junctionVariancesFwd_.at (block).deallocate ();
944984 break ;
945985 case sf_junction_ests_f:
946- v_junctionEstimatesFwd_.at (block).~matrix_2d ();
986+ v_junctionEstimatesFwd_.at (block).deallocate ();
947987 break ;
948988 case sf_junction_ests_r:
949- v_junctionEstimatesRev_.at (block).~matrix_2d ();
989+ v_junctionEstimatesRev_.at (block).deallocate ();
950990 break ;
951991 case sf_rigorous_vars:
952- v_rigorousVariances_.at (block).~matrix_2d ();
992+ v_rigorousVariances_.at (block).deallocate ();
953993 break ;
954994 case sf_prec_adj_msrs:
955- v_precAdjMsrsFull_.at (block).~matrix_2d ();
995+ v_precAdjMsrsFull_.at (block).deallocate ();
956996 break ;
957997 case sf_corrections:
958- v_corrections_.at (block).~matrix_2d ();
998+ v_corrections_.at (block).deallocate ();
959999
9601000 if (v_blockMeta_.at (block)._blockLast )
961- v_correctionsR_.at (block).~matrix_2d ();
1001+ v_correctionsR_.at (block).deallocate ();
9621002 break ;
9631003 }
9641004 }
0 commit comments