diff options
author | Marco Elver <marco.elver@ed.ac.uk> | 2012-09-10 11:57:43 -0400 |
---|---|---|
committer | Marco Elver <marco.elver@ed.ac.uk> | 2012-09-10 11:57:43 -0400 |
commit | 9e0edbcea8d14446487f13f56b65c669ba580673 (patch) | |
tree | 7780efe6534912c2020e4f7882d8868ccf250581 /src | |
parent | 21d4d50ba1f8aae47108db91bc20108812fb62a4 (diff) | |
download | gem5-9e0edbcea8d14446487f13f56b65c669ba580673.tar.xz |
Mem: Allow serializing of more than INT_MAX bytes
Despite gzwrite taking an unsigned for length, it returns an int for
bytes written; gzwrite fails if (int)len < 0. Because of this, call
gzwrite with len no larger than INT_MAX: write in blocks of INT_MAX if
data to be written is larger than INT_MAX.
Diffstat (limited to 'src')
-rw-r--r-- | src/mem/abstract_mem.cc | 15 |
1 files changed, 12 insertions, 3 deletions
diff --git a/src/mem/abstract_mem.cc b/src/mem/abstract_mem.cc index a7016bb51..775517e3b 100644 --- a/src/mem/abstract_mem.cc +++ b/src/mem/abstract_mem.cc @@ -51,6 +51,7 @@ #include <cerrno> #include <cstdio> +#include <climits> #include <iostream> #include <string> @@ -486,9 +487,17 @@ AbstractMemory::serialize(ostream &os) fatal("Insufficient memory to allocate compression state for %s\n", filename); - if (gzwrite(compressedMem, pmemAddr, size()) != (int)size()) { - fatal("Write failed on physical memory checkpoint file '%s'\n", - filename); + uint64_t pass_size = 0; + // gzwrite fails if (int)len < 0 (gzwrite returns int) + for (uint64_t written = 0; written < size(); written += pass_size) { + pass_size = (uint64_t)INT_MAX < (size() - written) ? + (uint64_t)INT_MAX : (size() - written); + + if (gzwrite(compressedMem, pmemAddr + written, + (unsigned int) pass_size) != (int)pass_size) { + fatal("Write failed on physical memory checkpoint file '%s'\n", + filename); + } } if (gzclose(compressedMem)) |