Improve ChecksumCalculator
- Expose the checksum sizes through public constants to allow
users to preallocate static arrays for those
- Get rid of a slower memcpy() operations in checksum calculation
Change-Id: Ieaa92fce7b32b75a5db0f94d505c917ecfa16f74
diff --git a/shared/OpenglCodecCommon/ChecksumCalculator.cpp b/shared/OpenglCodecCommon/ChecksumCalculator.cpp
index 7bd8211..8983524 100644
--- a/shared/OpenglCodecCommon/ChecksumCalculator.cpp
+++ b/shared/OpenglCodecCommon/ChecksumCalculator.cpp
@@ -20,24 +20,13 @@
// Checklist when implementing new protocol:
// 1. update CHECKSUMHELPER_MAX_VERSION
-// 2. update maxChecksumSize()
+// 2. update ChecksumCalculator::Sizes enum
// 3. update checksumByteSize()
// 4. update addBuffer, writeChecksum, resetChecksum, validate
// change CHECKSUMHELPER_MAX_VERSION when you want to update the protocol version
#define CHECKSUMHELPER_MAX_VERSION 1
-// checksum buffer size
-// Please add a new checksum buffer size when implementing a new protocol,
-// as well as modifying the maxChecksumSize function.
-static const size_t kV1ChecksumSize = 8;
-
-static size_t maxChecksumSize() {
- return 0 > kV1ChecksumSize ? 0 : kV1ChecksumSize;
-}
-
-static const size_t kMaxChecksumSize = maxChecksumSize();
-
// utility macros to create checksum string at compilation time
#define CHECKSUMHELPER_VERSION_STR_PREFIX "ANDROID_EMU_CHECKSUM_HELPER_v"
#define CHECKSUMHELPER_MACRO_TO_STR(x) #x
@@ -134,17 +123,22 @@
resetChecksum();
return false;
}
- // buffers for computing the checksum
- unsigned char sChecksumBuffer[kMaxChecksumSize];
+ bool isValid;
switch (m_version) {
case 1: {
- uint32_t val = computeV1Checksum();
- memcpy(sChecksumBuffer, &val, sizeof(val));
- memcpy(sChecksumBuffer+sizeof(val), &m_numRead, sizeof(m_numRead));
+ const uint32_t val = computeV1Checksum();
+ isValid = 0 == memcmp(&val, expectedChecksum, sizeof(val)) &&
+ 0 == memcmp(&m_numRead,
+ static_cast<const char*>(expectedChecksum) +
+ sizeof(val),
+ sizeof(m_numRead));
+
break;
}
+ default:
+ isValid = true; // No checksum is a valid checksum.
+ break;
}
- bool isValid = !memcmp(sChecksumBuffer, expectedChecksum, checksumSize);
m_numRead++;
resetChecksum();
return isValid;