diff options
| -rw-r--r-- | ChangeLog | 11 | ||||
| -rw-r--r-- | src/AbstractDiskWriter.cc | 2 | ||||
| -rw-r--r-- | src/AbstractDiskWriter.h | 2 | ||||
| -rw-r--r-- | src/ByteArrayDiskWriter.cc | 14 | ||||
| -rw-r--r-- | src/ByteArrayDiskWriter.h | 5 | ||||
| -rw-r--r-- | src/DiskWriter.h | 2 | ||||
| -rw-r--r-- | test/ByteArrayDiskWriterTest.cc | 2 |
7 files changed, 28 insertions, 10 deletions
@@ -1,5 +1,16 @@ 2008-11-17 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net> + Rewritten ByteArrayDiskWriter::size() using seekg() and tellg(). + Removed const qualifier from DiskWriter::size(). + * src/AbstractDiskWriter.cc + * src/AbstractDiskWriter.h + * src/ByteArrayDiskWriter.cc + * src/ByteArrayDiskWriter.h + * src/DiskWriter.h + * test/ByteArrayDiskWriterTest.cc + +2008-11-17 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net> + Fixed the bug that causes segmentation fault/bus error during executing choking algorithm while seeding. This is caused by improper implementation of compare function which returns inconsistent results diff --git a/src/AbstractDiskWriter.cc b/src/AbstractDiskWriter.cc index d1ce0076..d3a31f5a 100644 --- a/src/AbstractDiskWriter.cc +++ b/src/AbstractDiskWriter.cc @@ -185,7 +185,7 @@ void AbstractDiskWriter::truncate(uint64_t length) } // TODO the file descriptor fd must be opened before calling this function. -uint64_t AbstractDiskWriter::size() const +uint64_t AbstractDiskWriter::size() { if(fd == -1) { throw DlAbortEx("File not opened."); diff --git a/src/AbstractDiskWriter.h b/src/AbstractDiskWriter.h index 5067bc62..d459ee48 100644 --- a/src/AbstractDiskWriter.h +++ b/src/AbstractDiskWriter.h @@ -72,7 +72,7 @@ public: virtual void truncate(uint64_t length); - virtual uint64_t size() const; + virtual uint64_t size(); virtual void enableDirectIO(); diff --git a/src/ByteArrayDiskWriter.cc b/src/ByteArrayDiskWriter.cc index 011ed25b..dbe22cc3 100644 --- a/src/ByteArrayDiskWriter.cc +++ b/src/ByteArrayDiskWriter.cc @@ -66,9 +66,10 @@ void ByteArrayDiskWriter::openExistingFile(const std::string& filename, void ByteArrayDiskWriter::writeData(const unsigned char* data, size_t dataLength, off_t position) { - if(size() < (uint64_t)position) { - buf.seekp(size(), std::ios::beg); - for(uint64_t i = size(); i < (uint64_t)position; ++i) { + uint64_t length = size(); + if(length < (uint64_t)position) { + buf.seekp(length, std::ios::beg); + for(uint64_t i = length; i < (uint64_t)position; ++i) { buf.put('\0'); } } else { @@ -85,4 +86,11 @@ ssize_t ByteArrayDiskWriter::readData(unsigned char* data, size_t len, off_t pos return buf.gcount(); } +uint64_t ByteArrayDiskWriter::size() +{ + buf.seekg(0, std::ios::end); + buf.clear(); + return buf.tellg(); +} + } // namespace aria2 diff --git a/src/ByteArrayDiskWriter.h b/src/ByteArrayDiskWriter.h index 313fd04e..2f8007c8 100644 --- a/src/ByteArrayDiskWriter.h +++ b/src/ByteArrayDiskWriter.h @@ -63,10 +63,7 @@ public: // Not implemented yet virtual void truncate(uint64_t length) {} - virtual uint64_t size() const - { - return buf.str().size(); - } + virtual uint64_t size(); virtual void enableDirectIO() {} diff --git a/src/DiskWriter.h b/src/DiskWriter.h index c57e8846..2084826e 100644 --- a/src/DiskWriter.h +++ b/src/DiskWriter.h @@ -77,7 +77,7 @@ public: virtual void truncate(uint64_t length) = 0; // Returns file length - virtual uint64_t size() const = 0; + virtual uint64_t size() = 0; virtual void enableDirectIO() = 0; diff --git a/test/ByteArrayDiskWriterTest.cc b/test/ByteArrayDiskWriterTest.cc index 2e6c52bd..002367c4 100644 --- a/test/ByteArrayDiskWriterTest.cc +++ b/test/ByteArrayDiskWriterTest.cc @@ -43,6 +43,7 @@ void ByteArrayDiskWriterTest::testWriteAndRead() { buf[c] = '\0'; CPPUNIT_ASSERT_EQUAL(std::string("ello World !!"), std::string(buf)); + CPPUNIT_ASSERT_EQUAL((uint64_t)14, bw.size()); } void ByteArrayDiskWriterTest::testWriteAndRead2() { @@ -58,6 +59,7 @@ void ByteArrayDiskWriterTest::testWriteAndRead2() { buf[c] = '\0'; CPPUNIT_ASSERT_EQUAL(std::string("Hello From Mars"), std::string(buf)); + CPPUNIT_ASSERT_EQUAL((uint64_t)15, bw.size()); } } // namespace aria2 |
