summaryrefslogtreecommitdiff
path: root/src/MultiDiskAdaptor.cc
diff options
context:
space:
mode:
authorTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2012-07-23 21:36:24 +0900
committerTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2012-07-23 21:42:47 +0900
commit860f4dd06ace859470e118d4b9a8d10ddf92d076 (patch)
tree1effdc3fd73160b57f5d6d109662a66e33050d08 /src/MultiDiskAdaptor.cc
parentf56743b0833551aa6845d0a4f1d05da02cb52175 (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.cc34
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);
}