Skip to content

Commit 2de4955

Browse files
leekilloughKenneth Griesser
authored andcommitted
Use std::vector for varying sized buffers (sstsimulator#1229)
1 parent 86aa8d6 commit 2de4955

File tree

1 file changed

+21
-44
lines changed

1 file changed

+21
-44
lines changed

src/sst/core/simulation.cc

Lines changed: 21 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -1599,24 +1599,22 @@ Simulation_impl::checkpoint(const std::string& checkpoint_filename)
15991599
SST::Core::Serialization::serializer ser;
16001600
ser.enable_pointer_tracking();
16011601

1602-
size_t size, buffer_size;
1603-
char* buffer;
1602+
size_t size;
16041603

16051604
/* Section 2: Loaded libraries */
16061605
ser.start_sizing();
16071606
std::set<std::string> libnames;
16081607
factory->getLoadedLibraryNames(libnames);
16091608
ser& libnames;
16101609

1611-
size = ser.size();
1612-
buffer_size = size;
1613-
buffer = new char[buffer_size];
1610+
size = ser.size();
1611+
std::vector<char> buffer(size);
16141612

1615-
ser.start_packing(buffer, size);
1613+
ser.start_packing(&buffer[0], size);
16161614
ser& libnames;
16171615

16181616
fs.write(reinterpret_cast<const char*>(&size), sizeof(size));
1619-
fs.write(buffer, size);
1617+
fs.write(&buffer[0], size);
16201618
offset += (sizeof(size) + size);
16211619

16221620

@@ -1658,14 +1656,10 @@ Simulation_impl::checkpoint(const std::string& checkpoint_filename)
16581656
ser& timeVortex;
16591657

16601658
size = ser.size();
1661-
if ( size > buffer_size ) {
1662-
delete[] buffer;
1663-
buffer_size = size;
1664-
buffer = new char[buffer_size];
1665-
}
1659+
buffer.resize(size);
16661660

16671661
// Pack buffer
1668-
ser.start_packing(buffer, size);
1662+
ser.start_packing(&buffer[0], size);
16691663
ser& num_ranks;
16701664
ser& my_rank;
16711665
ser& currentSimCycle;
@@ -1703,7 +1697,7 @@ Simulation_impl::checkpoint(const std::string& checkpoint_filename)
17031697

17041698
// Write buffer to file
17051699
fs.write(reinterpret_cast<const char*>(&size), sizeof(size));
1706-
fs.write(buffer, size);
1700+
fs.write(&buffer[0], size);
17071701
offset += (sizeof(size) + size);
17081702

17091703
size = compInfoMap.size();
@@ -1719,24 +1713,18 @@ Simulation_impl::checkpoint(const std::string& checkpoint_filename)
17191713
ComponentInfo* compinfo = *comp;
17201714
ser& compinfo;
17211715
size = ser.size();
1716+
buffer.resize(size);
17221717

1723-
if ( buffer_size < size ) {
1724-
delete[] buffer;
1725-
buffer = new char[size];
1726-
buffer_size = size;
1727-
}
1728-
1729-
ser.start_packing(buffer, size);
1718+
ser.start_packing(&buffer[0], size);
17301719
ser& compinfo;
17311720

17321721
component_blob_offsets_.emplace_back(compinfo->id_, offset);
17331722
fs.write(reinterpret_cast<const char*>(&size), sizeof(size));
1734-
fs.write(buffer, size);
1723+
fs.write(&buffer[0], size);
17351724
offset += (sizeof(size) + size);
17361725
}
17371726

17381727
fs.close();
1739-
delete[] buffer;
17401728

17411729
/*
17421730
* Still needs to be added to checkpoint:
@@ -1769,19 +1757,17 @@ Simulation_impl::restart(Config* cfg)
17691757
}
17701758
fs.close();
17711759

1772-
size_t size, buffer_size;
1773-
char* buffer;
1760+
size_t size;
17741761
SST::Core::Serialization::serializer ser;
17751762
ser.enable_pointer_tracking();
17761763
std::ifstream fs_blob(blob_filename, std::ios::binary);
17771764

17781765
/* Begin deserialization, libraries */
17791766
fs_blob.read(reinterpret_cast<char*>(&size), sizeof(size));
17801767

1781-
buffer_size = size;
1782-
buffer = new char[buffer_size];
1783-
fs_blob.read(buffer, size);
1784-
ser.start_unpacking(buffer, size);
1768+
std::vector<char> buffer(size);
1769+
fs_blob.read(&buffer[0], size);
1770+
ser.start_unpacking(&buffer[0], size);
17851771

17861772
std::set<std::string> libnames;
17871773
ser& libnames;
@@ -1791,14 +1777,10 @@ Simulation_impl::restart(Config* cfg)
17911777

17921778
/* Now get the global blob */
17931779
fs_blob.read(reinterpret_cast<char*>(&size), sizeof(size));
1794-
if ( size > buffer_size ) {
1795-
delete[] buffer;
1796-
buffer_size = size;
1797-
buffer = new char[buffer_size];
1798-
}
1799-
fs_blob.read(buffer, size);
1780+
buffer.resize(size);
1781+
fs_blob.read(&buffer[0], size);
18001782

1801-
ser.start_unpacking(buffer, size);
1783+
ser.start_unpacking(&buffer[0], size);
18021784

18031785
ser& num_ranks;
18041786
ser& my_rank;
@@ -1860,20 +1842,15 @@ Simulation_impl::restart(Config* cfg)
18601842
// Deserialize component blobs individually
18611843
for ( size_t comp = 0; comp < compCount; comp++ ) {
18621844
fs_blob.read(reinterpret_cast<char*>(&size), sizeof(size));
1863-
if ( size > buffer_size ) {
1864-
delete[] buffer;
1865-
buffer_size = size;
1866-
buffer = new char[buffer_size];
1867-
}
1868-
fs_blob.read(buffer, size);
1869-
ser.start_unpacking(buffer, size);
1845+
buffer.resize(size);
1846+
fs_blob.read(&buffer[0], size);
1847+
ser.start_unpacking(&buffer[0], size);
18701848
ComponentInfo* compInfo = new ComponentInfo();
18711849
ser& compInfo;
18721850
compInfoMap.insert(compInfo);
18731851
}
18741852

18751853
fs_blob.close();
1876-
delete[] buffer;
18771854

18781855
// If we are a parallel job, need to call
18791856
// finalizeLinkConfigurations() in order to finish setting up all

0 commit comments

Comments
 (0)