diff options
| author | Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com> | 2009-06-30 17:03:57 +0000 |
|---|---|---|
| committer | Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com> | 2009-06-30 17:03:57 +0000 |
| commit | cf19dce8553d8a05f5d307835ea3c429d9eb63f2 (patch) | |
| tree | 7326cc88a21d711218179d722c667dfaeaae249b /src/BitfieldMan.cc | |
| parent | cece2bc896b941d0c9b9d441460b5d32989268bd (diff) | |
2009-07-01 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>
HTTP pipelining is now working. Fixed Segmention fault in
BitfieldMan's copy ctor.
* src/AbstractCommand.cc
* src/BitfieldMan.cc
* src/BitfieldMan.h
* src/DownloadCommand.cc
* src/HttpDownloadCommand.cc
* src/HttpRequest.cc
* src/SegmentMan.cc
* src/SegmentMan.h
* test/BitfieldManTest.cc
* test/SegmentManTest.cc
Diffstat (limited to 'src/BitfieldMan.cc')
| -rw-r--r-- | src/BitfieldMan.cc | 25 |
1 files changed, 24 insertions, 1 deletions
diff --git a/src/BitfieldMan.cc b/src/BitfieldMan.cc index 2569c691..26e0fc2e 100644 --- a/src/BitfieldMan.cc +++ b/src/BitfieldMan.cc @@ -96,7 +96,7 @@ BitfieldMan::BitfieldMan(const BitfieldMan& bitfieldMan) memcpy(bitfield, bitfieldMan.bitfield, bitfieldLength); memcpy(useBitfield, bitfieldMan.useBitfield, bitfieldLength); filterEnabled = bitfieldMan.filterEnabled; - if(filterBitfield) { + if(filterEnabled) { filterBitfield = new unsigned char[bitfieldLength]; memcpy(filterBitfield, bitfieldMan.filterBitfield, bitfieldLength); } else { @@ -612,6 +612,29 @@ void BitfieldMan::removeFilter(uint64_t offset, uint64_t length) { updateCache(); } +void BitfieldMan::addNotFilter(uint64_t offset, uint64_t length) +{ + // TODO1.5 Create ensureFilterBitfield() to initialize this + if(!filterBitfield) { + filterBitfield = new unsigned char[bitfieldLength]; + memset(filterBitfield, 0, bitfieldLength); + } + if(length > 0 && blocks > 0) { + size_t startBlock = offset/blockLength; + if(blocks <= startBlock) { + startBlock = blocks; + } + size_t endBlock = (offset+length-1)/blockLength; + for(size_t i = 0; i < startBlock; ++i) { + setFilterBit(i); + } + for(size_t i = endBlock+1; i < blocks; ++i) { + setFilterBit(i); + } + } + updateCache(); +} + void BitfieldMan::enableFilter() { if(!filterBitfield) { filterBitfield = new unsigned char[bitfieldLength]; |
