From a71eea3b2c807a7f1cb37948b4738212bc49c3ce Mon Sep 17 00:00:00 2001 From: leekillough <15950023+leekillough@users.noreply.github.com> Date: Tue, 4 Mar 2025 20:35:18 -0600 Subject: [PATCH] Use std::vector for varying sized buffers --- src/sst/core/simulation.cc | 65 ++++++++++++-------------------------- 1 file changed, 21 insertions(+), 44 deletions(-) diff --git a/src/sst/core/simulation.cc b/src/sst/core/simulation.cc index 71f81c3c8..3230c4f92 100644 --- a/src/sst/core/simulation.cc +++ b/src/sst/core/simulation.cc @@ -1605,8 +1605,7 @@ Simulation_impl::checkpoint(const std::string& checkpoint_filename) SST::Core::Serialization::serializer ser; ser.enable_pointer_tracking(); - size_t size, buffer_size; - char* buffer; + size_t size; /* Section 2: Loaded libraries */ ser.start_sizing(); @@ -1614,15 +1613,14 @@ Simulation_impl::checkpoint(const std::string& checkpoint_filename) factory->getLoadedLibraryNames(libnames); ser& libnames; - size = ser.size(); - buffer_size = size; - buffer = new char[buffer_size]; + size = ser.size(); + std::vector buffer(size); - ser.start_packing(buffer, size); + ser.start_packing(&buffer[0], size); ser& libnames; fs.write(reinterpret_cast(&size), sizeof(size)); - fs.write(buffer, size); + fs.write(&buffer[0], size); offset += (sizeof(size) + size); @@ -1664,14 +1662,10 @@ Simulation_impl::checkpoint(const std::string& checkpoint_filename) ser& timeVortex; size = ser.size(); - if ( size > buffer_size ) { - delete[] buffer; - buffer_size = size; - buffer = new char[buffer_size]; - } + buffer.resize(size); // Pack buffer - ser.start_packing(buffer, size); + ser.start_packing(&buffer[0], size); ser& num_ranks; ser& my_rank; ser& currentSimCycle; @@ -1709,7 +1703,7 @@ Simulation_impl::checkpoint(const std::string& checkpoint_filename) // Write buffer to file fs.write(reinterpret_cast(&size), sizeof(size)); - fs.write(buffer, size); + fs.write(&buffer[0], size); offset += (sizeof(size) + size); size = compInfoMap.size(); @@ -1725,24 +1719,18 @@ Simulation_impl::checkpoint(const std::string& checkpoint_filename) ComponentInfo* compinfo = *comp; ser& compinfo; size = ser.size(); + buffer.resize(size); - if ( buffer_size < size ) { - delete[] buffer; - buffer = new char[size]; - buffer_size = size; - } - - ser.start_packing(buffer, size); + ser.start_packing(&buffer[0], size); ser& compinfo; component_blob_offsets_.emplace_back(compinfo->id_, offset); fs.write(reinterpret_cast(&size), sizeof(size)); - fs.write(buffer, size); + fs.write(&buffer[0], size); offset += (sizeof(size) + size); } fs.close(); - delete[] buffer; /* * Still needs to be added to checkpoint: @@ -1775,8 +1763,7 @@ Simulation_impl::restart(Config* cfg) } fs.close(); - size_t size, buffer_size; - char* buffer; + size_t size; SST::Core::Serialization::serializer ser; ser.enable_pointer_tracking(); std::ifstream fs_blob(blob_filename, std::ios::binary); @@ -1784,10 +1771,9 @@ Simulation_impl::restart(Config* cfg) /* Begin deserialization, libraries */ fs_blob.read(reinterpret_cast(&size), sizeof(size)); - buffer_size = size; - buffer = new char[buffer_size]; - fs_blob.read(buffer, size); - ser.start_unpacking(buffer, size); + std::vector buffer(size); + fs_blob.read(&buffer[0], size); + ser.start_unpacking(&buffer[0], size); std::set libnames; ser& libnames; @@ -1797,14 +1783,10 @@ Simulation_impl::restart(Config* cfg) /* Now get the global blob */ fs_blob.read(reinterpret_cast(&size), sizeof(size)); - if ( size > buffer_size ) { - delete[] buffer; - buffer_size = size; - buffer = new char[buffer_size]; - } - fs_blob.read(buffer, size); + buffer.resize(size); + fs_blob.read(&buffer[0], size); - ser.start_unpacking(buffer, size); + ser.start_unpacking(&buffer[0], size); ser& num_ranks; ser& my_rank; @@ -1866,20 +1848,15 @@ Simulation_impl::restart(Config* cfg) // Deserialize component blobs individually for ( size_t comp = 0; comp < compCount; comp++ ) { fs_blob.read(reinterpret_cast(&size), sizeof(size)); - if ( size > buffer_size ) { - delete[] buffer; - buffer_size = size; - buffer = new char[buffer_size]; - } - fs_blob.read(buffer, size); - ser.start_unpacking(buffer, size); + buffer.resize(size); + fs_blob.read(&buffer[0], size); + ser.start_unpacking(&buffer[0], size); ComponentInfo* compInfo = new ComponentInfo(); ser& compInfo; compInfoMap.insert(compInfo); } fs_blob.close(); - delete[] buffer; // If we are a parallel job, need to call // finalizeLinkConfigurations() in order to finish setting up all