diff options
| author | Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com> | 2012-07-23 21:36:24 +0900 |
|---|---|---|
| committer | Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com> | 2012-07-23 21:42:47 +0900 |
| commit | 860f4dd06ace859470e118d4b9a8d10ddf92d076 (patch) | |
| tree | 1effdc3fd73160b57f5d6d109662a66e33050d08 /src/MultiDiskAdaptor.cc | |
| parent | f56743b0833551aa6845d0a4f1d05da02cb52175 (diff) | |
Use int64_t instead of off_t
Using off_t, at least, in DiskAdaptor layer is problematic because
torrent can contain under 2GiB files but total sum of those files may
exceed 2GiB limit, which makes off_t overflow in 32 bit system without
large file support. So we use int64_t in API. We'll check the file
length before download so that it does not exceed max off_t.
Diffstat (limited to 'src/MultiDiskAdaptor.cc')
| -rw-r--r-- | src/MultiDiskAdaptor.cc | 34 |
1 files changed, 17 insertions, 17 deletions
diff --git a/src/MultiDiskAdaptor.cc b/src/MultiDiskAdaptor.cc index 4115c296..af83cd95 100644 --- a/src/MultiDiskAdaptor.cc +++ b/src/MultiDiskAdaptor.cc @@ -101,7 +101,7 @@ bool DiskWriterEntry::fileExists() return fileEntry_->exists(); } -off_t DiskWriterEntry::size() const +int64_t DiskWriterEntry::size() const { return File(getFilePath()).size(); } @@ -163,7 +163,7 @@ void MultiDiskAdaptor::resetDiskWriterEntries() ++itr; continue; } - off_t pieceStartOffset = + int64_t pieceStartOffset = (fileEntry->getOffset()/pieceLength_)*pieceLength_; if(itr != diskWriterEntries_.begin()) { for(std::vector<SharedHandle<DiskWriterEntry> >::const_iterator i = @@ -182,7 +182,7 @@ void MultiDiskAdaptor::resetDiskWriterEntries() } if(fileEntry->getLength() > 0) { - off_t lastPieceStartOffset = + int64_t lastPieceStartOffset = (fileEntry->getOffset()+fileEntry->getLength()-1)/ pieceLength_*pieceLength_; A2_LOG_DEBUG(fmt("Checking adjacent backward file to %s" @@ -201,7 +201,7 @@ void MultiDiskAdaptor::resetDiskWriterEntries() (*itr)->getFileEntry()->getPath().c_str(), (*itr)->getFileEntry()->getOffset())); if((*itr)->getFileEntry()->getOffset() < - static_cast<off_t>(lastPieceStartOffset+pieceLength_)) { + lastPieceStartOffset+pieceLength_) { A2_LOG_DEBUG (fmt("%s needs diskwriter", (*itr)->getFileEntry()->getPath().c_str())); @@ -305,7 +305,7 @@ void MultiDiskAdaptor::closeFile() } namespace { -bool isInRange(const DiskWriterEntryHandle entry, off_t offset) +bool isInRange(const DiskWriterEntryHandle entry, int64_t offset) { return entry->getFileEntry()->getOffset() <= offset && offset < entry->getFileEntry()->getLastOffset(); @@ -314,7 +314,7 @@ bool isInRange(const DiskWriterEntryHandle entry, off_t offset) namespace { ssize_t calculateLength(const DiskWriterEntryHandle entry, - off_t fileOffset, ssize_t rem) + int64_t fileOffset, ssize_t rem) { if(entry->getFileEntry()->getLength() < fileOffset+rem) { return entry->getFileEntry()->getLength()-fileOffset; @@ -327,7 +327,7 @@ ssize_t calculateLength(const DiskWriterEntryHandle entry, namespace { class OffsetCompare { public: - bool operator()(off_t offset, const SharedHandle<DiskWriterEntry>& dwe) + bool operator()(int64_t offset, const SharedHandle<DiskWriterEntry>& dwe) { return offset < dwe->getFileEntry()->getOffset(); } @@ -336,7 +336,7 @@ public: namespace { DiskWriterEntries::const_iterator findFirstDiskWriterEntry -(const DiskWriterEntries& diskWriterEntries, off_t offset) +(const DiskWriterEntries& diskWriterEntries, int64_t offset) { DiskWriterEntries::const_iterator first = std::upper_bound(diskWriterEntries.begin(), diskWriterEntries.end(), @@ -355,7 +355,7 @@ DiskWriterEntries::const_iterator findFirstDiskWriterEntry namespace { void throwOnDiskWriterNotOpened(const SharedHandle<DiskWriterEntry>& e, - off_t offset) + int64_t offset) { throw DL_ABORT_EX (fmt("DiskWriter for offset=%" PRId64 ", filename=%s is not opened.", @@ -365,13 +365,13 @@ void throwOnDiskWriterNotOpened(const SharedHandle<DiskWriterEntry>& e, } // namespace void MultiDiskAdaptor::writeData(const unsigned char* data, size_t len, - off_t offset) + int64_t offset) { DiskWriterEntries::const_iterator first = findFirstDiskWriterEntry(diskWriterEntries_, offset); ssize_t rem = len; - off_t fileOffset = offset-(*first)->getFileEntry()->getOffset(); + int64_t fileOffset = offset-(*first)->getFileEntry()->getOffset(); for(DiskWriterEntries::const_iterator i = first, eoi = diskWriterEntries_.end(); i != eoi; ++i) { ssize_t writeLength = calculateLength(*i, fileOffset, rem); @@ -392,14 +392,14 @@ void MultiDiskAdaptor::writeData(const unsigned char* data, size_t len, } ssize_t MultiDiskAdaptor::readData -(unsigned char* data, size_t len, off_t offset) +(unsigned char* data, size_t len, int64_t offset) { DiskWriterEntries::const_iterator first = findFirstDiskWriterEntry(diskWriterEntries_, offset); ssize_t rem = len; ssize_t totalReadLength = 0; - off_t fileOffset = offset-(*first)->getFileEntry()->getOffset(); + int64_t fileOffset = offset-(*first)->getFileEntry()->getOffset(); for(DiskWriterEntries::const_iterator i = first, eoi = diskWriterEntries_.end(); i != eoi; ++i) { ssize_t readLength = calculateLength(*i, fileOffset, rem); @@ -428,9 +428,9 @@ bool MultiDiskAdaptor::fileExists() getFileEntries().end(); } -off_t MultiDiskAdaptor::size() +int64_t MultiDiskAdaptor::size() { - off_t size = 0; + int64_t size = 0; for(std::vector<SharedHandle<FileEntry> >::const_iterator i = getFileEntries().begin(), eoi = getFileEntries().end(); i != eoi; ++i) { size += File((*i)->getPath()).size(); @@ -464,9 +464,9 @@ void MultiDiskAdaptor::cutTrailingGarbage() for(std::vector<SharedHandle<DiskWriterEntry> >::const_iterator i = diskWriterEntries_.begin(), eoi = diskWriterEntries_.end(); i != eoi; ++i) { - off_t length = (*i)->getFileEntry()->getLength(); + int64_t length = (*i)->getFileEntry()->getLength(); if(File((*i)->getFilePath()).size() > length) { - // We need open file before calling DiskWriter::truncate(off_t) + // We need open file before calling DiskWriter::truncate(int64_t) openIfNot(*i, &DiskWriterEntry::openFile); (*i)->getDiskWriter()->truncate(length); } |
