BitfieldMan.cc 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913
  1. /* <!-- copyright */
  2. /*
  3. * aria2 - The high speed download utility
  4. *
  5. * Copyright (C) 2006 Tatsuhiro Tsujikawa
  6. *
  7. * This program is free software; you can redistribute it and/or modify
  8. * it under the terms of the GNU General Public License as published by
  9. * the Free Software Foundation; either version 2 of the License, or
  10. * (at your option) any later version.
  11. *
  12. * This program is distributed in the hope that it will be useful,
  13. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  15. * GNU General Public License for more details.
  16. *
  17. * You should have received a copy of the GNU General Public License
  18. * along with this program; if not, write to the Free Software
  19. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  20. *
  21. * In addition, as a special exception, the copyright holders give
  22. * permission to link the code of portions of this program with the
  23. * OpenSSL library under certain conditions as described in each
  24. * individual source file, and distribute linked combinations
  25. * including the two.
  26. * You must obey the GNU General Public License in all respects
  27. * for all of the code used other than OpenSSL. If you modify
  28. * file(s) with this exception, you may extend this exception to your
  29. * version of the file(s), but you are not obligated to do so. If you
  30. * do not wish to do so, delete this exception statement from your
  31. * version. If you delete this exception statement from all source
  32. * files in the program, then also delete it here.
  33. */
  34. /* copyright --> */
  35. #include "BitfieldMan.h"
  36. #include <cassert>
  37. #include <cstring>
  38. #include "array_fun.h"
  39. #include "bitfield.h"
  40. using namespace aria2::expr;
  41. namespace aria2 {
  42. BitfieldMan::BitfieldMan(int32_t blockLength, int64_t totalLength)
  43. :blockLength_(blockLength),
  44. totalLength_(totalLength),
  45. bitfieldLength_(0),
  46. blocks_(0),
  47. filterEnabled_(false),
  48. bitfield_(0),
  49. useBitfield_(0),
  50. filterBitfield_(0),
  51. cachedNumMissingBlock_(0),
  52. cachedNumFilteredBlock_(0),
  53. cachedCompletedLength_(0),
  54. cachedFilteredCompletedLength_(0),
  55. cachedFilteredTotalLength_(0)
  56. {
  57. if(blockLength_ > 0 && totalLength_ > 0) {
  58. blocks_ = (totalLength_+blockLength_-1)/blockLength_;
  59. bitfieldLength_ = blocks_/8+(blocks_%8 ? 1 : 0);
  60. bitfield_ = new unsigned char[bitfieldLength_];
  61. useBitfield_ = new unsigned char[bitfieldLength_];
  62. memset(bitfield_, 0, bitfieldLength_);
  63. memset(useBitfield_, 0, bitfieldLength_);
  64. updateCache();
  65. }
  66. }
  67. BitfieldMan::BitfieldMan(const BitfieldMan& bitfieldMan)
  68. :blockLength_(bitfieldMan.blockLength_),
  69. totalLength_(bitfieldMan.totalLength_),
  70. bitfieldLength_(bitfieldMan.bitfieldLength_),
  71. blocks_(bitfieldMan.blocks_),
  72. filterEnabled_(bitfieldMan.filterEnabled_),
  73. bitfield_(new unsigned char[bitfieldLength_]),
  74. useBitfield_(new unsigned char[bitfieldLength_]),
  75. filterBitfield_(0),
  76. cachedNumMissingBlock_(0),
  77. cachedNumFilteredBlock_(0),
  78. cachedCompletedLength_(0),
  79. cachedFilteredCompletedLength_(0),
  80. cachedFilteredTotalLength_(0)
  81. {
  82. memcpy(bitfield_, bitfieldMan.bitfield_, bitfieldLength_);
  83. memcpy(useBitfield_, bitfieldMan.useBitfield_, bitfieldLength_);
  84. if(filterEnabled_) {
  85. filterBitfield_ = new unsigned char[bitfieldLength_];
  86. memcpy(filterBitfield_, bitfieldMan.filterBitfield_, bitfieldLength_);
  87. }
  88. updateCache();
  89. }
  90. BitfieldMan& BitfieldMan::operator=(const BitfieldMan& bitfieldMan)
  91. {
  92. if(this != &bitfieldMan) {
  93. blockLength_ = bitfieldMan.blockLength_;
  94. totalLength_ = bitfieldMan.totalLength_;
  95. blocks_ = bitfieldMan.blocks_;
  96. bitfieldLength_ = bitfieldMan.bitfieldLength_;
  97. filterEnabled_ = bitfieldMan.filterEnabled_;
  98. delete [] bitfield_;
  99. bitfield_ = new unsigned char[bitfieldLength_];
  100. memcpy(bitfield_, bitfieldMan.bitfield_, bitfieldLength_);
  101. delete [] useBitfield_;
  102. useBitfield_ = new unsigned char[bitfieldLength_];
  103. memcpy(useBitfield_, bitfieldMan.useBitfield_, bitfieldLength_);
  104. delete [] filterBitfield_;
  105. if(filterEnabled_) {
  106. filterBitfield_ = new unsigned char[bitfieldLength_];
  107. memcpy(filterBitfield_, bitfieldMan.filterBitfield_, bitfieldLength_);
  108. } else {
  109. filterBitfield_ = 0;
  110. }
  111. updateCache();
  112. }
  113. return *this;
  114. }
  115. BitfieldMan::~BitfieldMan() {
  116. delete [] bitfield_;
  117. delete [] useBitfield_;
  118. delete [] filterBitfield_;
  119. }
  120. int32_t BitfieldMan::getLastBlockLength() const
  121. {
  122. return totalLength_-blockLength_*(blocks_-1);
  123. }
  124. int32_t BitfieldMan::getBlockLength(size_t index) const
  125. {
  126. if(index == blocks_-1) {
  127. return getLastBlockLength();
  128. } else if(index < blocks_-1) {
  129. return getBlockLength();
  130. } else {
  131. return 0;
  132. }
  133. }
  134. bool BitfieldMan::hasMissingPiece
  135. (const unsigned char* peerBitfield, size_t length) const
  136. {
  137. if(bitfieldLength_ != length) {
  138. return false;
  139. }
  140. bool retval = false;
  141. for(size_t i = 0; i < bitfieldLength_; ++i) {
  142. unsigned char temp = peerBitfield[i] & ~bitfield_[i];
  143. if(filterEnabled_) {
  144. temp &= filterBitfield_[i];
  145. }
  146. if(temp&0xffu) {
  147. retval = true;
  148. break;
  149. }
  150. }
  151. return retval;
  152. }
  153. bool BitfieldMan::getFirstMissingUnusedIndex(size_t& index) const
  154. {
  155. if(filterEnabled_) {
  156. return bitfield::getFirstSetBitIndex
  157. (index, ~array(bitfield_)&~array(useBitfield_)&array(filterBitfield_),
  158. blocks_);
  159. } else {
  160. return bitfield::getFirstSetBitIndex
  161. (index, ~array(bitfield_)&~array(useBitfield_), blocks_);
  162. }
  163. }
  164. size_t BitfieldMan::getFirstNMissingUnusedIndex
  165. (std::vector<size_t>& out, size_t n) const
  166. {
  167. if(filterEnabled_) {
  168. return bitfield::getFirstNSetBitIndex
  169. (std::back_inserter(out), n,
  170. ~array(bitfield_)&~array(useBitfield_)&array(filterBitfield_), blocks_);
  171. } else {
  172. return bitfield::getFirstNSetBitIndex
  173. (std::back_inserter(out), n,
  174. ~array(bitfield_)&~array(useBitfield_), blocks_);
  175. }
  176. }
  177. bool BitfieldMan::getFirstMissingIndex(size_t& index) const
  178. {
  179. if(filterEnabled_) {
  180. return bitfield::getFirstSetBitIndex
  181. (index, ~array(bitfield_)&array(filterBitfield_), blocks_);
  182. } else {
  183. return bitfield::getFirstSetBitIndex(index, ~array(bitfield_), blocks_);
  184. }
  185. }
  186. namespace {
  187. template<typename Array>
  188. size_t getStartIndex(size_t index, const Array& bitfield, size_t blocks) {
  189. while(index < blocks && bitfield::test(bitfield, blocks, index)) {
  190. ++index;
  191. }
  192. if(blocks <= index) {
  193. return blocks;
  194. } else {
  195. return index;
  196. }
  197. }
  198. } // namespace
  199. namespace {
  200. template<typename Array>
  201. size_t getEndIndex(size_t index, const Array& bitfield, size_t blocks) {
  202. while(index < blocks && !bitfield::test(bitfield, blocks, index)) {
  203. ++index;
  204. }
  205. return index;
  206. }
  207. } // namespace
  208. namespace {
  209. template<typename Array>
  210. bool getSparseMissingUnusedIndex
  211. (size_t& index,
  212. int32_t minSplitSize,
  213. const Array& bitfield,
  214. const unsigned char* useBitfield,
  215. int32_t blockLength,
  216. size_t blocks)
  217. {
  218. BitfieldMan::Range maxRange;
  219. BitfieldMan::Range currentRange;
  220. size_t nextIndex = 0;
  221. while(nextIndex < blocks) {
  222. currentRange.startIndex =
  223. getStartIndex(nextIndex, bitfield, blocks);
  224. if(currentRange.startIndex == blocks) {
  225. break;
  226. }
  227. currentRange.endIndex =
  228. getEndIndex(currentRange.startIndex, bitfield, blocks);
  229. if(currentRange.startIndex > 0) {
  230. if(bitfield::test(useBitfield, blocks, currentRange.startIndex-1)) {
  231. currentRange.startIndex = currentRange.getMidIndex();
  232. }
  233. }
  234. // If range is equal, choose a range where its startIndex-1 is
  235. // set.
  236. if(maxRange < currentRange ||
  237. (maxRange == currentRange &&
  238. maxRange.startIndex > 0 && currentRange.startIndex > 0 &&
  239. (!bitfield::test(bitfield, blocks, maxRange.startIndex-1) ||
  240. bitfield::test(useBitfield, blocks, maxRange.startIndex-1))
  241. &&
  242. bitfield::test(bitfield, blocks, currentRange.startIndex-1) &&
  243. !bitfield::test(useBitfield, blocks, currentRange.startIndex-1))) {
  244. maxRange = currentRange;
  245. }
  246. nextIndex = currentRange.endIndex;
  247. }
  248. if(maxRange.getSize()) {
  249. if(maxRange.startIndex == 0) {
  250. index = 0;
  251. return true;
  252. } else {
  253. if((!bitfield::test(useBitfield, blocks, maxRange.startIndex-1) &&
  254. bitfield::test(bitfield, blocks, maxRange.startIndex-1)) ||
  255. (static_cast<int64_t>(maxRange.endIndex-maxRange.startIndex)*
  256. blockLength >= minSplitSize)) {
  257. index = maxRange.startIndex;
  258. return true;
  259. } else {
  260. return false;
  261. }
  262. }
  263. } else {
  264. return false;
  265. }
  266. }
  267. } // namespace
  268. bool BitfieldMan::getSparseMissingUnusedIndex
  269. (size_t& index,
  270. int32_t minSplitSize,
  271. const unsigned char* ignoreBitfield,
  272. size_t ignoreBitfieldLength) const
  273. {
  274. if(filterEnabled_) {
  275. return aria2::getSparseMissingUnusedIndex
  276. (index, minSplitSize,
  277. array(ignoreBitfield)|~array(filterBitfield_)|
  278. array(bitfield_)|array(useBitfield_),
  279. useBitfield_, blockLength_, blocks_);
  280. } else {
  281. return aria2::getSparseMissingUnusedIndex
  282. (index, minSplitSize,
  283. array(ignoreBitfield)|array(bitfield_)|array(useBitfield_),
  284. useBitfield_, blockLength_, blocks_);
  285. }
  286. }
  287. namespace {
  288. template<typename Array>
  289. bool getGeomMissingUnusedIndex
  290. (size_t& index,
  291. int32_t minSplitSize,
  292. const Array& bitfield,
  293. const unsigned char* useBitfield,
  294. int32_t blockLength,
  295. size_t blocks,
  296. double base,
  297. size_t offsetIndex)
  298. {
  299. double start = 0;
  300. double end = 1;
  301. while(start+offsetIndex < blocks) {
  302. index = blocks;
  303. for(size_t i = start+offsetIndex,
  304. eoi = std::min(blocks, static_cast<size_t>(end+offsetIndex));
  305. i < eoi; ++i) {
  306. if(bitfield::test(useBitfield, blocks, i)) {
  307. break;
  308. } else if(!bitfield::test(bitfield, blocks, i)) {
  309. index = i;
  310. break;
  311. }
  312. }
  313. if(index < blocks) {
  314. return true;
  315. } else {
  316. start = end;
  317. end *= base;
  318. }
  319. }
  320. return getSparseMissingUnusedIndex(index, minSplitSize,
  321. bitfield, useBitfield,
  322. blockLength, blocks);
  323. }
  324. } // namespace
  325. bool BitfieldMan::getGeomMissingUnusedIndex
  326. (size_t& index,
  327. int32_t minSplitSize,
  328. const unsigned char* ignoreBitfield,
  329. size_t ignoreBitfieldLength,
  330. double base,
  331. size_t offsetIndex) const
  332. {
  333. if(filterEnabled_) {
  334. return aria2::getGeomMissingUnusedIndex
  335. (index, minSplitSize,
  336. array(ignoreBitfield)|~array(filterBitfield_)|
  337. array(bitfield_)|array(useBitfield_),
  338. useBitfield_, blockLength_, blocks_,
  339. base, offsetIndex);
  340. } else {
  341. return aria2::getGeomMissingUnusedIndex
  342. (index, minSplitSize,
  343. array(ignoreBitfield)|array(bitfield_)|array(useBitfield_),
  344. useBitfield_, blockLength_, blocks_,
  345. base, offsetIndex);
  346. }
  347. }
  348. namespace {
  349. template<typename Array>
  350. bool getInorderMissingUnusedIndex
  351. (size_t& index,
  352. int32_t minSplitSize,
  353. const Array& bitfield,
  354. const unsigned char* useBitfield,
  355. int32_t blockLength,
  356. size_t blocks)
  357. {
  358. // We always return first piece if it is available.
  359. if(!bitfield::test(bitfield, blocks, 0) &&
  360. !bitfield::test(useBitfield, blocks, 0)) {
  361. index = 0;
  362. return true;
  363. }
  364. for(size_t i = 1; i < blocks;) {
  365. if(!bitfield::test(bitfield, blocks, i) &&
  366. !bitfield::test(useBitfield, blocks, i)) {
  367. // If previous piece has already been retrieved, we can download
  368. // from this index.
  369. if(!bitfield::test(useBitfield, blocks, i-1) &&
  370. bitfield::test(bitfield, blocks, i-1)) {
  371. index = i;
  372. return true;
  373. }
  374. // Check free space of minSplitSize.
  375. size_t j;
  376. for(j = i; j < blocks; ++j) {
  377. if(bitfield::test(bitfield, blocks, j) ||
  378. bitfield::test(useBitfield, blocks, j)) {
  379. break;
  380. }
  381. if(static_cast<int64_t>(j-i+1)*blockLength >= minSplitSize) {
  382. index = j;
  383. return true;
  384. }
  385. }
  386. i = j+1;
  387. } else {
  388. ++i;
  389. }
  390. }
  391. return false;
  392. }
  393. } // namespace
  394. bool BitfieldMan::getInorderMissingUnusedIndex
  395. (size_t& index,
  396. int32_t minSplitSize,
  397. const unsigned char* ignoreBitfield,
  398. size_t ignoreBitfieldLength) const
  399. {
  400. if(filterEnabled_) {
  401. return aria2::getInorderMissingUnusedIndex
  402. (index, minSplitSize,
  403. array(ignoreBitfield)|~array(filterBitfield_)|
  404. array(bitfield_)|array(useBitfield_),
  405. useBitfield_, blockLength_, blocks_);
  406. } else {
  407. return aria2::getInorderMissingUnusedIndex
  408. (index, minSplitSize,
  409. array(ignoreBitfield)|array(bitfield_)|array(useBitfield_),
  410. useBitfield_, blockLength_, blocks_);
  411. }
  412. }
  413. namespace {
  414. template<typename Array>
  415. bool copyBitfield(unsigned char* dst, const Array& src, size_t blocks)
  416. {
  417. unsigned char bits = 0;
  418. size_t len = (blocks+7)/8;
  419. for(size_t i = 0; i < len-1; ++i) {
  420. dst[i] = src[i];
  421. bits |= dst[i];
  422. }
  423. dst[len-1] = src[len-1]&bitfield::lastByteMask(blocks);
  424. bits |= dst[len-1];
  425. return bits != 0;
  426. }
  427. } // namespace
  428. bool BitfieldMan::getAllMissingIndexes(unsigned char* misbitfield, size_t len)
  429. const
  430. {
  431. assert(len == bitfieldLength_);
  432. if(filterEnabled_) {
  433. return copyBitfield
  434. (misbitfield, ~array(bitfield_)&array(filterBitfield_), blocks_);
  435. } else {
  436. return copyBitfield(misbitfield, ~array(bitfield_), blocks_);
  437. }
  438. }
  439. bool BitfieldMan::getAllMissingIndexes(unsigned char* misbitfield, size_t len,
  440. const unsigned char* peerBitfield,
  441. size_t peerBitfieldLength) const
  442. {
  443. assert(len == bitfieldLength_);
  444. if(bitfieldLength_ != peerBitfieldLength) {
  445. return false;
  446. }
  447. if(filterEnabled_) {
  448. return copyBitfield
  449. (misbitfield,
  450. ~array(bitfield_)&array(peerBitfield)&array(filterBitfield_),
  451. blocks_);
  452. } else {
  453. return copyBitfield
  454. (misbitfield, ~array(bitfield_)&array(peerBitfield),
  455. blocks_);
  456. }
  457. }
  458. bool BitfieldMan::getAllMissingUnusedIndexes(unsigned char* misbitfield,
  459. size_t len,
  460. const unsigned char* peerBitfield,
  461. size_t peerBitfieldLength) const
  462. {
  463. assert(len == bitfieldLength_);
  464. if(bitfieldLength_ != peerBitfieldLength) {
  465. return false;
  466. }
  467. if(filterEnabled_) {
  468. return copyBitfield
  469. (misbitfield,
  470. ~array(bitfield_)&~array(useBitfield_)&array(peerBitfield)&
  471. array(filterBitfield_),
  472. blocks_);
  473. } else {
  474. return copyBitfield
  475. (misbitfield,
  476. ~array(bitfield_)&~array(useBitfield_)&array(peerBitfield),
  477. blocks_);
  478. }
  479. }
  480. size_t BitfieldMan::countMissingBlock() const {
  481. return cachedNumMissingBlock_;
  482. }
  483. size_t BitfieldMan::countMissingBlockNow() const {
  484. if(filterEnabled_) {
  485. array_ptr<unsigned char> temp(new unsigned char[bitfieldLength_]);
  486. for(size_t i = 0; i < bitfieldLength_; ++i) {
  487. temp[i] = bitfield_[i]&filterBitfield_[i];
  488. }
  489. size_t count = bitfield::countSetBit(filterBitfield_, blocks_)-
  490. bitfield::countSetBit(temp, blocks_);
  491. return count;
  492. } else {
  493. return blocks_-bitfield::countSetBit(bitfield_, blocks_);
  494. }
  495. }
  496. size_t BitfieldMan::countFilteredBlockNow() const {
  497. if(filterEnabled_) {
  498. return bitfield::countSetBit(filterBitfield_, blocks_);
  499. } else {
  500. return 0;
  501. }
  502. }
  503. bool BitfieldMan::setBitInternal(unsigned char* bitfield, size_t index, bool on) {
  504. if(blocks_ <= index) { return false; }
  505. unsigned char mask = 128 >> (index%8);
  506. if(on) {
  507. bitfield[index/8] |= mask;
  508. } else {
  509. bitfield[index/8] &= ~mask;
  510. }
  511. return true;
  512. }
  513. bool BitfieldMan::setUseBit(size_t index) {
  514. return setBitInternal(useBitfield_, index, true);
  515. }
  516. bool BitfieldMan::unsetUseBit(size_t index) {
  517. return setBitInternal(useBitfield_, index, false);
  518. }
  519. bool BitfieldMan::setBit(size_t index) {
  520. bool b = setBitInternal(bitfield_, index, true);
  521. updateCache();
  522. return b;
  523. }
  524. bool BitfieldMan::unsetBit(size_t index) {
  525. bool b = setBitInternal(bitfield_, index, false);
  526. updateCache();
  527. return b;
  528. }
  529. bool BitfieldMan::isFilteredAllBitSet() const {
  530. if(filterEnabled_) {
  531. for(size_t i = 0; i < bitfieldLength_; ++i) {
  532. if((bitfield_[i]&filterBitfield_[i]) != filterBitfield_[i]) {
  533. return false;
  534. }
  535. }
  536. return true;
  537. } else {
  538. return isAllBitSet();
  539. }
  540. }
  541. namespace {
  542. bool testAllBitSet
  543. (const unsigned char* bitfield, size_t length, size_t blocks)
  544. {
  545. if(length == 0) {
  546. return true;
  547. }
  548. for(size_t i = 0; i < length-1; ++i) {
  549. if(bitfield[i] != 0xffu) {
  550. return false;
  551. }
  552. }
  553. return bitfield[length-1] == bitfield::lastByteMask(blocks);
  554. }
  555. } // namespace
  556. bool BitfieldMan::isAllBitSet() const
  557. {
  558. return testAllBitSet(bitfield_, bitfieldLength_, blocks_);
  559. }
  560. bool BitfieldMan::isAllFilterBitSet() const
  561. {
  562. if(!filterBitfield_) {
  563. return false;
  564. }
  565. return testAllBitSet(filterBitfield_, bitfieldLength_, blocks_);
  566. }
  567. bool BitfieldMan::isBitSet(size_t index) const
  568. {
  569. return bitfield::test(bitfield_, blocks_, index);
  570. }
  571. bool BitfieldMan::isUseBitSet(size_t index) const
  572. {
  573. return bitfield::test(useBitfield_, blocks_, index);
  574. }
  575. void BitfieldMan::setBitfield(const unsigned char* bitfield, size_t bitfieldLength) {
  576. if(bitfieldLength_ != bitfieldLength) {
  577. return;
  578. }
  579. memcpy(bitfield_, bitfield, bitfieldLength_);
  580. memset(useBitfield_, 0, bitfieldLength_);
  581. updateCache();
  582. }
  583. void BitfieldMan::clearAllBit() {
  584. memset(bitfield_, 0, bitfieldLength_);
  585. updateCache();
  586. }
  587. void BitfieldMan::setAllBit() {
  588. for(size_t i = 0; i < blocks_; ++i) {
  589. setBitInternal(bitfield_, i, true);
  590. }
  591. updateCache();
  592. }
  593. void BitfieldMan::clearAllUseBit() {
  594. memset(useBitfield_, 0, bitfieldLength_);
  595. updateCache();
  596. }
  597. void BitfieldMan::setAllUseBit() {
  598. for(size_t i = 0; i < blocks_; ++i) {
  599. setBitInternal(useBitfield_, i, true);
  600. }
  601. }
  602. bool BitfieldMan::setFilterBit(size_t index) {
  603. return setBitInternal(filterBitfield_, index, true);
  604. }
  605. void BitfieldMan::ensureFilterBitfield()
  606. {
  607. if(!filterBitfield_) {
  608. filterBitfield_ = new unsigned char[bitfieldLength_];
  609. memset(filterBitfield_, 0, bitfieldLength_);
  610. }
  611. }
  612. void BitfieldMan::addFilter(int64_t offset, int64_t length) {
  613. ensureFilterBitfield();
  614. if(length > 0) {
  615. size_t startBlock = offset/blockLength_;
  616. size_t endBlock = (offset+length-1)/blockLength_;
  617. for(size_t i = startBlock; i <= endBlock && i < blocks_; i++) {
  618. setFilterBit(i);
  619. }
  620. }
  621. updateCache();
  622. }
  623. void BitfieldMan::removeFilter(int64_t offset, int64_t length) {
  624. ensureFilterBitfield();
  625. if(length > 0) {
  626. size_t startBlock = offset/blockLength_;
  627. size_t endBlock = (offset+length-1)/blockLength_;
  628. for(size_t i = startBlock; i <= endBlock && i < blocks_; i++) {
  629. setBitInternal(filterBitfield_, i, false);
  630. }
  631. }
  632. updateCache();
  633. }
  634. void BitfieldMan::addNotFilter(int64_t offset, int64_t length)
  635. {
  636. ensureFilterBitfield();
  637. if(length > 0 && blocks_ > 0) {
  638. size_t startBlock = offset/blockLength_;
  639. if(blocks_ <= startBlock) {
  640. startBlock = blocks_;
  641. }
  642. size_t endBlock = (offset+length-1)/blockLength_;
  643. for(size_t i = 0; i < startBlock; ++i) {
  644. setFilterBit(i);
  645. }
  646. for(size_t i = endBlock+1; i < blocks_; ++i) {
  647. setFilterBit(i);
  648. }
  649. }
  650. updateCache();
  651. }
  652. void BitfieldMan::enableFilter() {
  653. ensureFilterBitfield();
  654. filterEnabled_ = true;
  655. updateCache();
  656. }
  657. void BitfieldMan::disableFilter() {
  658. filterEnabled_ = false;
  659. updateCache();
  660. }
  661. void BitfieldMan::clearFilter() {
  662. if(filterBitfield_) {
  663. delete [] filterBitfield_;
  664. filterBitfield_ = 0;
  665. }
  666. filterEnabled_ = false;
  667. updateCache();
  668. }
  669. int64_t BitfieldMan::getFilteredTotalLengthNow() const {
  670. if(!filterBitfield_) {
  671. return 0;
  672. }
  673. size_t filteredBlocks = bitfield::countSetBit(filterBitfield_, blocks_);
  674. if(filteredBlocks == 0) {
  675. return 0;
  676. }
  677. if(bitfield::test(filterBitfield_, blocks_, blocks_-1)) {
  678. return ((int64_t)filteredBlocks-1)*blockLength_+getLastBlockLength();
  679. } else {
  680. return ((int64_t)filteredBlocks)*blockLength_;
  681. }
  682. }
  683. int64_t BitfieldMan::getCompletedLength(bool useFilter) const {
  684. unsigned char* temp;
  685. if(useFilter) {
  686. temp = new unsigned char[bitfieldLength_];
  687. for(size_t i = 0; i < bitfieldLength_; ++i) {
  688. temp[i] = bitfield_[i];
  689. if(filterEnabled_) {
  690. temp[i] &= filterBitfield_[i];
  691. }
  692. }
  693. } else {
  694. temp = bitfield_;
  695. }
  696. size_t completedBlocks = bitfield::countSetBit(temp, blocks_);
  697. int64_t completedLength = 0;
  698. if(completedBlocks == 0) {
  699. completedLength = 0;
  700. } else {
  701. if(bitfield::test(temp, blocks_, blocks_-1)) {
  702. completedLength =
  703. ((int64_t)completedBlocks-1)*blockLength_+getLastBlockLength();
  704. } else {
  705. completedLength = ((int64_t)completedBlocks)*blockLength_;
  706. }
  707. }
  708. if(useFilter) {
  709. delete [] temp;
  710. }
  711. return completedLength;
  712. }
  713. int64_t BitfieldMan::getCompletedLengthNow() const {
  714. return getCompletedLength(false);
  715. }
  716. int64_t BitfieldMan::getFilteredCompletedLengthNow() const {
  717. return getCompletedLength(true);
  718. }
  719. void BitfieldMan::updateCache()
  720. {
  721. cachedNumMissingBlock_ = countMissingBlockNow();
  722. cachedNumFilteredBlock_ = countFilteredBlockNow();
  723. cachedFilteredTotalLength_ = getFilteredTotalLengthNow();
  724. cachedCompletedLength_ = getCompletedLengthNow();
  725. cachedFilteredCompletedLength_ = getFilteredCompletedLengthNow();
  726. }
  727. bool BitfieldMan::isBitRangeSet(size_t startIndex, size_t endIndex) const
  728. {
  729. for(size_t i = startIndex; i <= endIndex; ++i) {
  730. if(!isBitSet(i)) {
  731. return false;
  732. }
  733. }
  734. return true;
  735. }
  736. void BitfieldMan::unsetBitRange(size_t startIndex, size_t endIndex)
  737. {
  738. for(size_t i = startIndex; i <= endIndex; ++i) {
  739. unsetBit(i);
  740. }
  741. updateCache();
  742. }
  743. void BitfieldMan::setBitRange(size_t startIndex, size_t endIndex)
  744. {
  745. for(size_t i = startIndex; i <= endIndex; ++i) {
  746. setBit(i);
  747. }
  748. updateCache();
  749. }
  750. bool BitfieldMan::isBitSetOffsetRange(int64_t offset, int64_t length) const
  751. {
  752. if(length <= 0) {
  753. return false;
  754. }
  755. if(totalLength_ <= offset) {
  756. return false;
  757. }
  758. if(totalLength_ < offset+length) {
  759. length = totalLength_-offset;
  760. }
  761. size_t startBlock = offset/blockLength_;
  762. size_t endBlock = (offset+length-1)/blockLength_;
  763. for(size_t i = startBlock; i <= endBlock; i++) {
  764. if(!isBitSet(i)) {
  765. return false;
  766. }
  767. }
  768. return true;
  769. }
  770. int64_t BitfieldMan::getOffsetCompletedLength
  771. (int64_t offset,
  772. int64_t length) const
  773. {
  774. int64_t res = 0;
  775. if(length == 0 || totalLength_ <= offset) {
  776. return 0;
  777. }
  778. if(totalLength_ < offset+length) {
  779. length = totalLength_-offset;
  780. }
  781. size_t start = offset/blockLength_;
  782. size_t end = (offset+length-1)/blockLength_;
  783. if(start == end) {
  784. if(isBitSet(start)) {
  785. res = length;
  786. }
  787. } else {
  788. if(isBitSet(start)) {
  789. res += (start+1)*blockLength_-offset;
  790. }
  791. for(size_t i = start+1; i <= end-1; ++i) {
  792. if(isBitSet(i)) {
  793. res += blockLength_;
  794. }
  795. }
  796. if(isBitSet(end)) {
  797. res += offset+length-end*blockLength_;
  798. }
  799. }
  800. return res;
  801. }
  802. int64_t BitfieldMan::getMissingUnusedLength(size_t startingIndex) const
  803. {
  804. if(blocks_ <= startingIndex) {
  805. return 0;
  806. }
  807. int64_t length = 0;
  808. for(size_t i = startingIndex; i < blocks_; ++i) {
  809. if(isBitSet(i) || isUseBitSet(i)) {
  810. break;
  811. }
  812. length += getBlockLength(i);
  813. }
  814. return length;
  815. }
  816. BitfieldMan::Range::Range(size_t startIndex, size_t endIndex)
  817. :
  818. startIndex(startIndex),
  819. endIndex(endIndex)
  820. {}
  821. size_t BitfieldMan::Range::getSize() const
  822. {
  823. return endIndex-startIndex;
  824. }
  825. size_t BitfieldMan::Range::getMidIndex() const
  826. {
  827. return (endIndex-startIndex)/2+startIndex;
  828. }
  829. bool BitfieldMan::Range::operator<(const Range& range) const
  830. {
  831. return getSize() < range.getSize();
  832. }
  833. bool BitfieldMan::Range::operator==(const Range& range) const
  834. {
  835. return getSize() == range.getSize();
  836. }
  837. } // namespace aria2