summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2008-11-17 12:07:24 +0000
committerTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2008-11-17 12:07:24 +0000
commitb0029fa4bfe3e92ff42aef657f92fa38d007f894 (patch)
treeeb717d06265e2bdc071eec6af41aede59e1b2815
parent644f707519f74cafc04925379be0b3f60f3939be (diff)
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
-rw-r--r--ChangeLog11
-rw-r--r--src/AbstractDiskWriter.cc2
-rw-r--r--src/AbstractDiskWriter.h2
-rw-r--r--src/ByteArrayDiskWriter.cc14
-rw-r--r--src/ByteArrayDiskWriter.h5
-rw-r--r--src/DiskWriter.h2
-rw-r--r--test/ByteArrayDiskWriterTest.cc2
7 files changed, 28 insertions, 10 deletions
diff --git a/ChangeLog b/ChangeLog
index 23bce9be..2b453c91 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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