summaryrefslogtreecommitdiff
path: root/src/IteratableChecksumValidator.cc
diff options
context:
space:
mode:
authorTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2007-12-05 13:41:56 +0000
committerTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2007-12-05 13:41:56 +0000
commitb75dbc4bbe73133b18c3b2d64f457d8d0bd50d35 (patch)
treea240b3625fea0e10b6baba673ca3eb6d1e08c796 /src/IteratableChecksumValidator.cc
parent24bdbf9aa6790f95b14449fed62d83fd196a0124 (diff)
2007-12-05 Tatsuhiro Tsujikawa <tujikawa at rednoah dot com>
Enable direct I/O support in checksum checking. * src/IteratableChunkChecksumValidator.{h, cc} * test/IteratableChunkChecksumValidatorTest.cc * src/CheckIntegrityEntry.cc * src/PieceHashCheckIntegrityEntry.cc * src/IteratableChecksumValidator.{h, cc} * src/BtCheckIntegrityEntry.cc: Added doc.
Diffstat (limited to 'src/IteratableChecksumValidator.cc')
-rw-r--r--src/IteratableChecksumValidator.cc23
1 files changed, 17 insertions, 6 deletions
diff --git a/src/IteratableChecksumValidator.cc b/src/IteratableChecksumValidator.cc
index fc68474b..b3db4b8b 100644
--- a/src/IteratableChecksumValidator.cc
+++ b/src/IteratableChecksumValidator.cc
@@ -43,7 +43,8 @@
#include "DiskAdaptor.h"
#include "BitfieldMan.h"
-#define BUFSIZE 16*1024
+#define BUFSIZE (256*1024)
+#define ALIGNMENT 512
IteratableChecksumValidator::IteratableChecksumValidator(const SingleFileDownloadContextHandle& dctx,
const PieceStorageHandle& pieceStorage):
@@ -51,16 +52,21 @@ IteratableChecksumValidator::IteratableChecksumValidator(const SingleFileDownloa
_pieceStorage(pieceStorage),
_currentOffset(0),
_ctx(0),
- _logger(LogFactory::getInstance()) {}
+ _logger(LogFactory::getInstance()),
+ _buffer(0) {}
-IteratableChecksumValidator::~IteratableChecksumValidator() {}
+IteratableChecksumValidator::~IteratableChecksumValidator()
+{
+ delete [] _buffer;
+}
void IteratableChecksumValidator::validateChunk()
{
if(!finished()) {
- unsigned char data[BUFSIZE];
- int32_t length = _pieceStorage->getDiskAdaptor()->readData(data, sizeof(data), _currentOffset);
- _ctx->digestUpdate(data, length);
+ int32_t length = _pieceStorage->getDiskAdaptor()->readData(_buffer,
+ BUFSIZE,
+ _currentOffset);
+ _ctx->digestUpdate(_buffer, length);
_currentOffset += length;
if(finished()) {
string actualChecksum = Util::toHex((const unsigned char*)_ctx->digestFinal().c_str(), _ctx->digestLength());
@@ -86,6 +92,11 @@ int64_t IteratableChecksumValidator::getTotalLength() const
void IteratableChecksumValidator::init()
{
+#ifdef HAVE_POSIX_MEMALIGN
+ _buffer = (unsigned char*)Util::allocateAlignedMemory(ALIGNMENT, BUFSIZE);
+#else
+ _buffer = new unsigned char[BUFSIZE];
+#endif // HAVE_POSIX_MEMALIGN
_currentOffset = 0;
_ctx = new MessageDigestContext();
_ctx->trySetAlgo(_dctx->getChecksumHashAlgo());