diff --git a/ChangeLog b/ChangeLog index 8f0b25b6..1e2923f8 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,16 @@ +2007-12-06 Tatsuhiro Tsujikawa + + Changed Direct/IO enable/disable procesure in file allocation routine. + * src/SingleFileAllocationIterator.cc + (SingleFileAllocationIterator): + Disable directIO if offset is not multiple of 512. + (~SingleFileAllocationIterator): Removed a call to disableDirectIO. + * src/MultiFileAllocationIterator.cc (allocateChunk): + Enable created SingleFileAllocationIterator's directIO. + * src/FileAllocationEntry.cc + (FileAllocationEntry): Enable directIO here. + (~FileAllocationEntry): Disable directIO here. + 2007-12-06 Tatsuhiro Tsujikawa Fixed the bug: aria2 doesn't utilize fast set index offered by peer. diff --git a/src/FileAllocationEntry.cc b/src/FileAllocationEntry.cc index f369bcb0..df9cfcc0 100644 --- a/src/FileAllocationEntry.cc +++ b/src/FileAllocationEntry.cc @@ -42,10 +42,14 @@ FileAllocationEntry::FileAllocationEntry(RequestGroup* requestGroup, Command* nextCommand): RequestGroupEntry(requestGroup, nextCommand), _fileAllocationIterator(requestGroup->getPieceStorage()->getDiskAdaptor()->fileAllocationIterator()) -{} +{ + _requestGroup->getPieceStorage()->getDiskAdaptor()->enableDirectIO(); +} FileAllocationEntry:: ~FileAllocationEntry() -{} +{ + _requestGroup->getPieceStorage()->getDiskAdaptor()->disableDirectIO(); +} int64_t FileAllocationEntry::getCurrentLength() { diff --git a/src/MultiFileAllocationIterator.cc b/src/MultiFileAllocationIterator.cc index 04961ae6..b6f8dd10 100644 --- a/src/MultiFileAllocationIterator.cc +++ b/src/MultiFileAllocationIterator.cc @@ -57,6 +57,7 @@ void MultiFileAllocationIterator::allocateChunk() _entries.pop_front(); FileEntryHandle fileEntry = entry->getFileEntry(); if(entry->size() < fileEntry->getLength()) { + entry->getDiskWriter()->enableDirectIO(); _fileAllocationIterator = new SingleFileAllocationIterator(entry->getDiskWriter().get(), entry->size(), diff --git a/src/SingleFileAllocationIterator.cc b/src/SingleFileAllocationIterator.cc index ae6d513e..e71e16eb 100644 --- a/src/SingleFileAllocationIterator.cc +++ b/src/SingleFileAllocationIterator.cc @@ -38,24 +38,24 @@ #include "a2io.h" #define BUFSIZE (256*1024) +#define ALIGNMENT 512 SingleFileAllocationIterator::SingleFileAllocationIterator(BinaryStream* stream, int64_t offset, int64_t totalLength):_stream(stream), _offset(offset), _totalLength(totalLength), _buffer(0) { - if(_offset%512 == 0) { - _stream->enableDirectIO(); + if(_offset%ALIGNMENT != 0) { + _stream->disableDirectIO(); } } SingleFileAllocationIterator::~SingleFileAllocationIterator() { delete [] _buffer; - _stream->disableDirectIO(); } void SingleFileAllocationIterator::init() { #ifdef HAVE_POSIX_MEMALIGN - _buffer = (unsigned char*)Util::allocateAlignedMemory(512, BUFSIZE); + _buffer = (unsigned char*)Util::allocateAlignedMemory(ALIGNMENT, BUFSIZE); #else _buffer = new unsigned char[BUFSIZE]; #endif // HAVE_POSIX_MEMALIGN