diff options
| author | Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com> | 2007-11-28 14:22:28 +0000 |
|---|---|---|
| committer | Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com> | 2007-11-28 14:22:28 +0000 |
| commit | 5a2f398eca68b2b0330ddcec2b222bf76875f82f (patch) | |
| tree | eb916885f04126e7e48b56fe02de6b44f0493c17 /src/SingleFileAllocationIterator.cc | |
| parent | a022a1826bb573028f264bc6edbc564c0d488bbc (diff) | |
2007-11-28 Tatsuhiro Tsujikawa <tujikawa at rednoah dot com>
Added direct I/O support. The current implementation uses O_DIRECT,
which is not posix standard and is tested on linux 2.6.21.
Currently only file allocation uses direct I/O.
* src/SingleFileAllocationIterator.{h, cc}
* test/SingleFileAllocationIteratorTest.cc
* src/MultiFileAllocationIterator.{h, cc}
* test/MultiFileAllocationIteratorTest.cc
* src/BinaryStream.h
* src/DiskWriter.h
* src/AbstractDiskWriter.{h, cc}
* src/ByteArrayDiskWriter.h
* src/DiskAdaptor.h
* src/AbstractSingleDiskAdaptor.{h, cc}
* src/MultiDiskAdaptor.{h, cc}
* src/FileAllocationEntry.cc
* src/Util.{h, cc}
* src/OptionHandlerFactory.cc
* src/prefs.h
* src/version_usage.cc
* src/option_processing.cc
Moved FileAllocationMan::markCurrentFileAllocationEntryDone() to
handleException.
* src/MultiFileAllocationIterator.cc
Added EINTR handling
* src/SocketCore.cc
Diffstat (limited to 'src/SingleFileAllocationIterator.cc')
| -rw-r--r-- | src/SingleFileAllocationIterator.cc | 47 |
1 files changed, 27 insertions, 20 deletions
diff --git a/src/SingleFileAllocationIterator.cc b/src/SingleFileAllocationIterator.cc index 1384c163..620410fa 100644 --- a/src/SingleFileAllocationIterator.cc +++ b/src/SingleFileAllocationIterator.cc @@ -33,35 +33,42 @@ */ /* copyright --> */ #include "SingleFileAllocationIterator.h" -#include "AbstractSingleDiskAdaptor.h" +#include "BinaryStream.h" +#include "Util.h" +#include "a2io.h" -#define BUFSIZE 16*1024 +#define BUFSIZE (256*1024) -SingleFileAllocationIterator::SingleFileAllocationIterator(AbstractSingleDiskAdaptor* diskAdaptor):_diskAdaptor(diskAdaptor), _offset(diskAdaptor->size()) {} +SingleFileAllocationIterator::SingleFileAllocationIterator(BinaryStream* stream, int64_t offset, int64_t totalLength):_stream(stream), _offset(offset), _totalLength(totalLength), _buffer(0) +{} -SingleFileAllocationIterator::~SingleFileAllocationIterator() {} +SingleFileAllocationIterator::~SingleFileAllocationIterator() +{ + delete [] _buffer; +} -void SingleFileAllocationIterator::allocateChunk() +void SingleFileAllocationIterator::init() { - int32_t bufSize = BUFSIZE; - unsigned char buf[BUFSIZE]; - memset(buf, 0, bufSize); - - _diskAdaptor->writeData(buf, bufSize, _offset); - _offset += bufSize; - - if(_diskAdaptor->getTotalLength() < _offset) { - _diskAdaptor->truncate(getTotalLength()); - _offset = getTotalLength(); - } +#ifdef HAVE_POSIX_MEMALIGN + _buffer = (unsigned char*)Util::allocateAlignedMemory(512, BUFSIZE); +#else + _buffer = new unsigned char[BUFSIZE]; +#endif // HAVE_POSIX_MEMALIGN + memset(_buffer, 0, BUFSIZE); } -bool SingleFileAllocationIterator::finished() +void SingleFileAllocationIterator::allocateChunk() { - return getCurrentLength() >= getTotalLength(); + _stream->writeData(_buffer, BUFSIZE, _offset); + _offset += BUFSIZE; + + if(_totalLength < _offset) { + _stream->truncate(_totalLength); + _offset = _totalLength; + } } -int64_t SingleFileAllocationIterator::getTotalLength() +bool SingleFileAllocationIterator::finished() { - return _diskAdaptor->getTotalLength(); + return _offset >= _totalLength; } |
