BitfieldMan.cc 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946
  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. : totalLength_(totalLength),
  44. cachedCompletedLength_(0),
  45. cachedFilteredCompletedLength_(0),
  46. cachedFilteredTotalLength_(0),
  47. bitfield_(nullptr),
  48. useBitfield_(nullptr),
  49. filterBitfield_(nullptr),
  50. bitfieldLength_(0),
  51. cachedNumMissingBlock_(0),
  52. cachedNumFilteredBlock_(0),
  53. blocks_(0),
  54. blockLength_(blockLength),
  55. filterEnabled_(false)
  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. : totalLength_(bitfieldMan.totalLength_),
  69. cachedCompletedLength_(0),
  70. cachedFilteredCompletedLength_(0),
  71. cachedFilteredTotalLength_(0),
  72. bitfield_(new unsigned char[bitfieldMan.bitfieldLength_]),
  73. useBitfield_(new unsigned char[bitfieldMan.bitfieldLength_]),
  74. filterBitfield_(nullptr),
  75. bitfieldLength_(bitfieldMan.bitfieldLength_),
  76. cachedNumMissingBlock_(0),
  77. cachedNumFilteredBlock_(0),
  78. blocks_(bitfieldMan.blocks_),
  79. blockLength_(bitfieldMan.blockLength_),
  80. filterEnabled_(bitfieldMan.filterEnabled_)
  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. totalLength_ = bitfieldMan.totalLength_;
  94. blockLength_ = bitfieldMan.blockLength_;
  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_ = nullptr;
  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. size_t startIndex,
  353. size_t lastIndex,
  354. int32_t minSplitSize,
  355. const Array& bitfield,
  356. const unsigned char* useBitfield,
  357. int32_t blockLength,
  358. size_t blocks)
  359. {
  360. // We always return first piece if it is available.
  361. if(!bitfield::test(bitfield, blocks, startIndex) &&
  362. !bitfield::test(useBitfield, blocks, startIndex)) {
  363. index = startIndex;
  364. return true;
  365. }
  366. for(size_t i = startIndex + 1; i < lastIndex;) {
  367. if(!bitfield::test(bitfield, blocks, i) &&
  368. !bitfield::test(useBitfield, blocks, i)) {
  369. // If previous piece has already been retrieved, we can download
  370. // from this index.
  371. if(!bitfield::test(useBitfield, blocks, i-1) &&
  372. bitfield::test(bitfield, blocks, i-1)) {
  373. index = i;
  374. return true;
  375. }
  376. // Check free space of minSplitSize. When checking this, we use
  377. // blocks instead of lastIndex.
  378. size_t j;
  379. for(j = i; j < blocks; ++j) {
  380. if(bitfield::test(bitfield, blocks, j) ||
  381. bitfield::test(useBitfield, blocks, j)) {
  382. break;
  383. }
  384. if(static_cast<int64_t>(j-i+1)*blockLength >= minSplitSize) {
  385. index = j;
  386. return true;
  387. }
  388. }
  389. i = j+1;
  390. } else {
  391. ++i;
  392. }
  393. }
  394. return false;
  395. }
  396. } // namespace
  397. bool BitfieldMan::getInorderMissingUnusedIndex
  398. (size_t& index,
  399. int32_t minSplitSize,
  400. const unsigned char* ignoreBitfield,
  401. size_t ignoreBitfieldLength) const
  402. {
  403. if(filterEnabled_) {
  404. return aria2::getInorderMissingUnusedIndex
  405. (index, 0, blocks_, minSplitSize,
  406. array(ignoreBitfield)|~array(filterBitfield_)|
  407. array(bitfield_)|array(useBitfield_),
  408. useBitfield_, blockLength_, blocks_);
  409. } else {
  410. return aria2::getInorderMissingUnusedIndex
  411. (index, 0, blocks_, minSplitSize,
  412. array(ignoreBitfield)|array(bitfield_)|array(useBitfield_),
  413. useBitfield_, blockLength_, blocks_);
  414. }
  415. }
  416. bool BitfieldMan::getInorderMissingUnusedIndex
  417. (size_t& index,
  418. size_t startIndex,
  419. size_t endIndex,
  420. int32_t minSplitSize,
  421. const unsigned char* ignoreBitfield,
  422. size_t ignoreBitfieldLength) const
  423. {
  424. endIndex = std::min(endIndex, blocks_);
  425. if(filterEnabled_) {
  426. return aria2::getInorderMissingUnusedIndex
  427. (index, startIndex, endIndex, minSplitSize,
  428. array(ignoreBitfield)|~array(filterBitfield_)|
  429. array(bitfield_)|array(useBitfield_),
  430. useBitfield_, blockLength_, blocks_);
  431. } else {
  432. return aria2::getInorderMissingUnusedIndex
  433. (index, startIndex, endIndex, minSplitSize,
  434. array(ignoreBitfield)|array(bitfield_)|array(useBitfield_),
  435. useBitfield_, blockLength_, blocks_);
  436. }
  437. }
  438. namespace {
  439. template<typename Array>
  440. bool copyBitfield(unsigned char* dst, const Array& src, size_t blocks)
  441. {
  442. unsigned char bits = 0;
  443. size_t len = (blocks+7)/8;
  444. for(size_t i = 0; i < len-1; ++i) {
  445. dst[i] = src[i];
  446. bits |= dst[i];
  447. }
  448. dst[len-1] = src[len-1]&bitfield::lastByteMask(blocks);
  449. bits |= dst[len-1];
  450. return bits != 0;
  451. }
  452. } // namespace
  453. bool BitfieldMan::getAllMissingIndexes(unsigned char* misbitfield, size_t len)
  454. const
  455. {
  456. assert(len == bitfieldLength_);
  457. if(filterEnabled_) {
  458. return copyBitfield
  459. (misbitfield, ~array(bitfield_)&array(filterBitfield_), blocks_);
  460. } else {
  461. return copyBitfield(misbitfield, ~array(bitfield_), blocks_);
  462. }
  463. }
  464. bool BitfieldMan::getAllMissingIndexes(unsigned char* misbitfield, size_t len,
  465. const unsigned char* peerBitfield,
  466. size_t peerBitfieldLength) const
  467. {
  468. assert(len == bitfieldLength_);
  469. if(bitfieldLength_ != peerBitfieldLength) {
  470. return false;
  471. }
  472. if(filterEnabled_) {
  473. return copyBitfield
  474. (misbitfield,
  475. ~array(bitfield_)&array(peerBitfield)&array(filterBitfield_),
  476. blocks_);
  477. } else {
  478. return copyBitfield
  479. (misbitfield, ~array(bitfield_)&array(peerBitfield),
  480. blocks_);
  481. }
  482. }
  483. bool BitfieldMan::getAllMissingUnusedIndexes(unsigned char* misbitfield,
  484. size_t len,
  485. const unsigned char* peerBitfield,
  486. size_t peerBitfieldLength) const
  487. {
  488. assert(len == bitfieldLength_);
  489. if(bitfieldLength_ != peerBitfieldLength) {
  490. return false;
  491. }
  492. if(filterEnabled_) {
  493. return copyBitfield
  494. (misbitfield,
  495. ~array(bitfield_)&~array(useBitfield_)&array(peerBitfield)&
  496. array(filterBitfield_),
  497. blocks_);
  498. } else {
  499. return copyBitfield
  500. (misbitfield,
  501. ~array(bitfield_)&~array(useBitfield_)&array(peerBitfield),
  502. blocks_);
  503. }
  504. }
  505. size_t BitfieldMan::countMissingBlock() const {
  506. return cachedNumMissingBlock_;
  507. }
  508. size_t BitfieldMan::countMissingBlockNow() const {
  509. if(filterEnabled_) {
  510. return bitfield::countSetBit(filterBitfield_, blocks_) -
  511. bitfield::countSetBitSlow(array(bitfield_)&array(filterBitfield_),
  512. blocks_);
  513. } else {
  514. return blocks_-bitfield::countSetBit(bitfield_, blocks_);
  515. }
  516. }
  517. size_t BitfieldMan::countFilteredBlockNow() const {
  518. if(filterEnabled_) {
  519. return bitfield::countSetBit(filterBitfield_, blocks_);
  520. } else {
  521. return 0;
  522. }
  523. }
  524. bool BitfieldMan::setBitInternal(unsigned char* bitfield, size_t index, bool on) {
  525. if(blocks_ <= index) { return false; }
  526. unsigned char mask = 128 >> (index%8);
  527. if(on) {
  528. bitfield[index/8] |= mask;
  529. } else {
  530. bitfield[index/8] &= ~mask;
  531. }
  532. return true;
  533. }
  534. bool BitfieldMan::setUseBit(size_t index) {
  535. return setBitInternal(useBitfield_, index, true);
  536. }
  537. bool BitfieldMan::unsetUseBit(size_t index) {
  538. return setBitInternal(useBitfield_, index, false);
  539. }
  540. bool BitfieldMan::setBit(size_t index) {
  541. bool b = setBitInternal(bitfield_, index, true);
  542. updateCache();
  543. return b;
  544. }
  545. bool BitfieldMan::unsetBit(size_t index) {
  546. bool b = setBitInternal(bitfield_, index, false);
  547. updateCache();
  548. return b;
  549. }
  550. bool BitfieldMan::isFilteredAllBitSet() const {
  551. if(filterEnabled_) {
  552. for(size_t i = 0; i < bitfieldLength_; ++i) {
  553. if((bitfield_[i]&filterBitfield_[i]) != filterBitfield_[i]) {
  554. return false;
  555. }
  556. }
  557. return true;
  558. } else {
  559. return isAllBitSet();
  560. }
  561. }
  562. namespace {
  563. bool testAllBitSet
  564. (const unsigned char* bitfield, size_t length, size_t blocks)
  565. {
  566. if(length == 0) {
  567. return true;
  568. }
  569. for(size_t i = 0; i < length-1; ++i) {
  570. if(bitfield[i] != 0xffu) {
  571. return false;
  572. }
  573. }
  574. return bitfield[length-1] == bitfield::lastByteMask(blocks);
  575. }
  576. } // namespace
  577. bool BitfieldMan::isAllBitSet() const
  578. {
  579. return testAllBitSet(bitfield_, bitfieldLength_, blocks_);
  580. }
  581. bool BitfieldMan::isAllFilterBitSet() const
  582. {
  583. if(!filterBitfield_) {
  584. return false;
  585. }
  586. return testAllBitSet(filterBitfield_, bitfieldLength_, blocks_);
  587. }
  588. bool BitfieldMan::isFilterBitSet(size_t index) const {
  589. if(filterBitfield_) {
  590. return bitfield::test(filterBitfield_, blocks_, index);
  591. } else {
  592. return false;
  593. }
  594. }
  595. bool BitfieldMan::isBitSet(size_t index) const
  596. {
  597. return bitfield::test(bitfield_, blocks_, index);
  598. }
  599. bool BitfieldMan::isUseBitSet(size_t index) const
  600. {
  601. return bitfield::test(useBitfield_, blocks_, index);
  602. }
  603. void BitfieldMan::setBitfield(const unsigned char* bitfield, size_t bitfieldLength) {
  604. if(bitfieldLength_ != bitfieldLength) {
  605. return;
  606. }
  607. memcpy(bitfield_, bitfield, bitfieldLength_);
  608. memset(useBitfield_, 0, bitfieldLength_);
  609. updateCache();
  610. }
  611. void BitfieldMan::clearAllBit() {
  612. memset(bitfield_, 0, bitfieldLength_);
  613. updateCache();
  614. }
  615. void BitfieldMan::setAllBit() {
  616. for(size_t i = 0; i < blocks_; ++i) {
  617. setBitInternal(bitfield_, i, true);
  618. }
  619. updateCache();
  620. }
  621. void BitfieldMan::clearAllUseBit() {
  622. memset(useBitfield_, 0, bitfieldLength_);
  623. updateCache();
  624. }
  625. void BitfieldMan::setAllUseBit() {
  626. for(size_t i = 0; i < blocks_; ++i) {
  627. setBitInternal(useBitfield_, i, true);
  628. }
  629. }
  630. bool BitfieldMan::setFilterBit(size_t index) {
  631. return setBitInternal(filterBitfield_, index, true);
  632. }
  633. void BitfieldMan::ensureFilterBitfield()
  634. {
  635. if(!filterBitfield_) {
  636. filterBitfield_ = new unsigned char[bitfieldLength_];
  637. memset(filterBitfield_, 0, bitfieldLength_);
  638. }
  639. }
  640. void BitfieldMan::addFilter(int64_t offset, int64_t length) {
  641. ensureFilterBitfield();
  642. if(length > 0) {
  643. size_t startBlock = offset/blockLength_;
  644. size_t endBlock = (offset+length-1)/blockLength_;
  645. for(size_t i = startBlock; i <= endBlock && i < blocks_; i++) {
  646. setFilterBit(i);
  647. }
  648. }
  649. updateCache();
  650. }
  651. void BitfieldMan::removeFilter(int64_t offset, int64_t length) {
  652. ensureFilterBitfield();
  653. if(length > 0) {
  654. size_t startBlock = offset/blockLength_;
  655. size_t endBlock = (offset+length-1)/blockLength_;
  656. for(size_t i = startBlock; i <= endBlock && i < blocks_; i++) {
  657. setBitInternal(filterBitfield_, i, false);
  658. }
  659. }
  660. updateCache();
  661. }
  662. void BitfieldMan::addNotFilter(int64_t offset, int64_t length)
  663. {
  664. ensureFilterBitfield();
  665. if(length > 0 && blocks_ > 0) {
  666. size_t startBlock = offset/blockLength_;
  667. if(blocks_ <= startBlock) {
  668. startBlock = blocks_;
  669. }
  670. size_t endBlock = (offset+length-1)/blockLength_;
  671. for(size_t i = 0; i < startBlock; ++i) {
  672. setFilterBit(i);
  673. }
  674. for(size_t i = endBlock+1; i < blocks_; ++i) {
  675. setFilterBit(i);
  676. }
  677. }
  678. updateCache();
  679. }
  680. void BitfieldMan::enableFilter() {
  681. ensureFilterBitfield();
  682. filterEnabled_ = true;
  683. updateCache();
  684. }
  685. void BitfieldMan::disableFilter() {
  686. filterEnabled_ = false;
  687. updateCache();
  688. }
  689. void BitfieldMan::clearFilter() {
  690. if(filterBitfield_) {
  691. delete [] filterBitfield_;
  692. filterBitfield_ = nullptr;
  693. }
  694. filterEnabled_ = false;
  695. updateCache();
  696. }
  697. int64_t BitfieldMan::getFilteredTotalLengthNow() const {
  698. if(!filterBitfield_) {
  699. return 0;
  700. }
  701. size_t filteredBlocks = bitfield::countSetBit(filterBitfield_, blocks_);
  702. if(filteredBlocks == 0) {
  703. return 0;
  704. }
  705. if(bitfield::test(filterBitfield_, blocks_, blocks_-1)) {
  706. return ((int64_t)filteredBlocks-1)*blockLength_+getLastBlockLength();
  707. } else {
  708. return ((int64_t)filteredBlocks)*blockLength_;
  709. }
  710. }
  711. namespace {
  712. template<typename Array, typename CountFun>
  713. int64_t computeCompletedLength(const Array& bitfield,
  714. const BitfieldMan* btman,
  715. CountFun cntfun)
  716. {
  717. size_t nbits = btman->countBlock();
  718. size_t completedBlocks = cntfun(bitfield, nbits);
  719. int64_t completedLength = 0;
  720. if(completedBlocks == 0) {
  721. completedLength = 0;
  722. } else {
  723. if(bitfield::test(bitfield, nbits, nbits - 1)) {
  724. completedLength = ((int64_t)completedBlocks-1)*btman->getBlockLength() +
  725. btman->getLastBlockLength();
  726. } else {
  727. completedLength = ((int64_t)completedBlocks)*btman->getBlockLength();
  728. }
  729. }
  730. return completedLength;
  731. }
  732. } // namespace
  733. int64_t BitfieldMan::getCompletedLength(bool useFilter) const {
  734. if(useFilter && filterEnabled_) {
  735. auto arr = array(bitfield_)&array(filterBitfield_);
  736. return computeCompletedLength(arr,
  737. this,
  738. &bitfield::countSetBitSlow<decltype(arr)>);
  739. } else {
  740. return computeCompletedLength(bitfield_, this, &bitfield::countSetBit);
  741. }
  742. }
  743. int64_t BitfieldMan::getCompletedLengthNow() const {
  744. return getCompletedLength(false);
  745. }
  746. int64_t BitfieldMan::getFilteredCompletedLengthNow() const {
  747. return getCompletedLength(true);
  748. }
  749. void BitfieldMan::updateCache()
  750. {
  751. cachedNumMissingBlock_ = countMissingBlockNow();
  752. cachedNumFilteredBlock_ = countFilteredBlockNow();
  753. cachedFilteredTotalLength_ = getFilteredTotalLengthNow();
  754. cachedCompletedLength_ = getCompletedLengthNow();
  755. cachedFilteredCompletedLength_ = getFilteredCompletedLengthNow();
  756. }
  757. bool BitfieldMan::isBitRangeSet(size_t startIndex, size_t endIndex) const
  758. {
  759. for(size_t i = startIndex; i <= endIndex; ++i) {
  760. if(!isBitSet(i)) {
  761. return false;
  762. }
  763. }
  764. return true;
  765. }
  766. void BitfieldMan::unsetBitRange(size_t startIndex, size_t endIndex)
  767. {
  768. for(size_t i = startIndex; i <= endIndex; ++i) {
  769. unsetBit(i);
  770. }
  771. updateCache();
  772. }
  773. void BitfieldMan::setBitRange(size_t startIndex, size_t endIndex)
  774. {
  775. for(size_t i = startIndex; i <= endIndex; ++i) {
  776. setBit(i);
  777. }
  778. updateCache();
  779. }
  780. bool BitfieldMan::isBitSetOffsetRange(int64_t offset, int64_t length) const
  781. {
  782. if(length <= 0) {
  783. return false;
  784. }
  785. if(totalLength_ <= offset) {
  786. return false;
  787. }
  788. if(totalLength_ < offset+length) {
  789. length = totalLength_-offset;
  790. }
  791. size_t startBlock = offset/blockLength_;
  792. size_t endBlock = (offset+length-1)/blockLength_;
  793. for(size_t i = startBlock; i <= endBlock; i++) {
  794. if(!isBitSet(i)) {
  795. return false;
  796. }
  797. }
  798. return true;
  799. }
  800. int64_t BitfieldMan::getOffsetCompletedLength
  801. (int64_t offset,
  802. int64_t length) const
  803. {
  804. int64_t res = 0;
  805. if(length == 0 || totalLength_ <= offset) {
  806. return 0;
  807. }
  808. if(totalLength_ < offset+length) {
  809. length = totalLength_-offset;
  810. }
  811. size_t start = offset/blockLength_;
  812. size_t end = (offset+length-1)/blockLength_;
  813. if(start == end) {
  814. if(isBitSet(start)) {
  815. res = length;
  816. }
  817. } else {
  818. if(isBitSet(start)) {
  819. res += static_cast<int64_t>(start+1)*blockLength_-offset;
  820. }
  821. for(size_t i = start+1; i <= end-1; ++i) {
  822. if(isBitSet(i)) {
  823. res += blockLength_;
  824. }
  825. }
  826. if(isBitSet(end)) {
  827. res += offset+length-static_cast<int64_t>(end)*blockLength_;
  828. }
  829. }
  830. return res;
  831. }
  832. int64_t BitfieldMan::getMissingUnusedLength(size_t startingIndex) const
  833. {
  834. if(blocks_ <= startingIndex) {
  835. return 0;
  836. }
  837. int64_t length = 0;
  838. for(size_t i = startingIndex; i < blocks_; ++i) {
  839. if(isBitSet(i) || isUseBitSet(i)) {
  840. break;
  841. }
  842. length += getBlockLength(i);
  843. }
  844. return length;
  845. }
  846. BitfieldMan::Range::Range(size_t startIndex, size_t endIndex)
  847. :
  848. startIndex(startIndex),
  849. endIndex(endIndex)
  850. {}
  851. size_t BitfieldMan::Range::getSize() const
  852. {
  853. return endIndex-startIndex;
  854. }
  855. size_t BitfieldMan::Range::getMidIndex() const
  856. {
  857. return (endIndex-startIndex)/2+startIndex;
  858. }
  859. bool BitfieldMan::Range::operator<(const Range& range) const
  860. {
  861. return getSize() < range.getSize();
  862. }
  863. bool BitfieldMan::Range::operator==(const Range& range) const
  864. {
  865. return getSize() == range.getSize();
  866. }
  867. } // namespace aria2