Ver Fonte

2008-11-15 Tatsuhiro Tsujikawa <[email protected]>

	Given custom random number generator to std::random_shuffle.
	* src/AnnounceList.cc
	* src/BtLeecherStateChoke.cc
	* src/BtSeederStateChoke.cc
	* src/DefaultBtRequestFactory.cc
	* src/MetalinkEntry.cc
	* src/RarestPieceSelector.cc
	* src/SimpleRandomizer.cc
	* src/SimpleRandomizer.h
Tatsuhiro Tsujikawa há 17 anos atrás
pai
commit
9b71a5d0b5

+ 12 - 0
ChangeLog

@@ -1,3 +1,15 @@
+2008-11-15  Tatsuhiro Tsujikawa  <[email protected]>
+
+	Given custom random number generator to std::random_shuffle.
+	* src/AnnounceList.cc
+	* src/BtLeecherStateChoke.cc
+	* src/BtSeederStateChoke.cc
+	* src/DefaultBtRequestFactory.cc
+	* src/MetalinkEntry.cc
+	* src/RarestPieceSelector.cc
+	* src/SimpleRandomizer.cc
+	* src/SimpleRandomizer.h
+
 2008-11-15  Tatsuhiro Tsujikawa  <[email protected]>
 2008-11-15  Tatsuhiro Tsujikawa  <[email protected]>
 
 
 	Now the default value of --enable-direct-io is true.
 	Now the default value of --enable-direct-io is true.

+ 6 - 2
src/AnnounceList.cc

@@ -33,10 +33,13 @@
  */
  */
 /* copyright --> */
 /* copyright --> */
 #include "AnnounceList.h"
 #include "AnnounceList.h"
+
+#include <algorithm>
+
 #include "List.h"
 #include "List.h"
 #include "Data.h"
 #include "Data.h"
 #include "A2STR.h"
 #include "A2STR.h"
-#include <algorithm>
+#include "SimpleRandomizer.h"
 
 
 namespace aria2 {
 namespace aria2 {
 
 
@@ -238,7 +241,8 @@ void AnnounceList::shuffle() {
   for(AnnounceTiers::iterator itr = tiers.begin();
   for(AnnounceTiers::iterator itr = tiers.begin();
       itr != tiers.end(); itr++) {
       itr != tiers.end(); itr++) {
     std::deque<std::string>& urls = (*itr)->urls;
     std::deque<std::string>& urls = (*itr)->urls;
-    random_shuffle(urls.begin(), urls.end());
+    std::random_shuffle(urls.begin(), urls.end(),
+			*(SimpleRandomizer::getInstance().get()));
   }
   }
 }
 }
 
 

+ 8 - 3
src/BtLeecherStateChoke.cc

@@ -33,11 +33,14 @@
  */
  */
 /* copyright --> */
 /* copyright --> */
 #include "BtLeecherStateChoke.h"
 #include "BtLeecherStateChoke.h"
+
+#include <algorithm>
+
 #include "Peer.h"
 #include "Peer.h"
 #include "Logger.h"
 #include "Logger.h"
 #include "LogFactory.h"
 #include "LogFactory.h"
 #include "a2time.h"
 #include "a2time.h"
-#include <algorithm>
+#include "SimpleRandomizer.h"
 
 
 namespace aria2 {
 namespace aria2 {
 
 
@@ -101,7 +104,8 @@ void BtLeecherStateChoke::plannedOptimisticUnchoke(std::deque<Peer*>& peers)
   
   
   std::deque<Peer*>::iterator i = std::partition(peers.begin(), peers.end(), PeerFilter(true, true));
   std::deque<Peer*>::iterator i = std::partition(peers.begin(), peers.end(), PeerFilter(true, true));
   if(i != peers.begin()) {
   if(i != peers.begin()) {
-    std::random_shuffle(peers.begin(), i);
+    std::random_shuffle(peers.begin(), i,
+			*(SimpleRandomizer::getInstance().get()));
     (*peers.begin())->optUnchoking(true);
     (*peers.begin())->optUnchoking(true);
     _logger->info("POU: %s", (*peers.begin())->ipaddr.c_str());
     _logger->info("POU: %s", (*peers.begin())->ipaddr.c_str());
   }
   }
@@ -130,7 +134,8 @@ void BtLeecherStateChoke::regularUnchoke(std::deque<Peer*>& peers)
     }
     }
   }
   }
   if(fastOptUnchoker) {
   if(fastOptUnchoker) {
-    std::random_shuffle(peerIter, peers.end());
+    std::random_shuffle(peerIter, peers.end(),
+			*(SimpleRandomizer::getInstance().get()));
     for(std::deque<Peer*>::iterator i = peerIter; i != peers.end(); ++i) {
     for(std::deque<Peer*>::iterator i = peerIter; i != peers.end(); ++i) {
       if((*i)->peerInterested()) {
       if((*i)->peerInterested()) {
 	(*i)->optUnchoking(true);
 	(*i)->optUnchoking(true);

+ 4 - 1
src/BtSeederStateChoke.cc

@@ -47,6 +47,7 @@
 #include "Logger.h"
 #include "Logger.h"
 #include "LogFactory.h"
 #include "LogFactory.h"
 #include "a2time.h"
 #include "a2time.h"
+#include "SimpleRandomizer.h"
 
 
 namespace aria2 {
 namespace aria2 {
 
 
@@ -113,7 +114,9 @@ void BtSeederStateChoke::unchoke(std::deque<Peer*>& peers)
 		  (*r)->calculateUploadSpeed(now));
 		  (*r)->calculateUploadSpeed(now));
   }
   }
   if(_round == 2 && r != peers.end()) {
   if(_round == 2 && r != peers.end()) {
-    std::random_shuffle(r, peers.end());
+    std::random_shuffle(r, peers.end(),
+			*(SimpleRandomizer::getInstance().get()));
+    // TODO Is r invalidated here?
     (*r)->optUnchoking(true);
     (*r)->optUnchoking(true);
     _logger->info("POU: %s", (*r)->ipaddr.c_str());
     _logger->info("POU: %s", (*r)->ipaddr.c_str());
   }
   }

+ 3 - 1
src/DefaultBtRequestFactory.cc

@@ -46,6 +46,7 @@
 #include "BtMessageFactory.h"
 #include "BtMessageFactory.h"
 #include "BtMessage.h"
 #include "BtMessage.h"
 #include "a2functional.h"
 #include "a2functional.h"
+#include "SimpleRandomizer.h"
 
 
 namespace aria2 {
 namespace aria2 {
 
 
@@ -171,7 +172,8 @@ void DefaultBtRequestFactory::createRequestMessagesOnEndGame
     PieceHandle& piece = *itr;
     PieceHandle& piece = *itr;
     std::deque<size_t> missingBlockIndexes;
     std::deque<size_t> missingBlockIndexes;
     piece->getAllMissingBlockIndexes(missingBlockIndexes);
     piece->getAllMissingBlockIndexes(missingBlockIndexes);
-    std::random_shuffle(missingBlockIndexes.begin(), missingBlockIndexes.end());
+    std::random_shuffle(missingBlockIndexes.begin(), missingBlockIndexes.end(),
+			*(SimpleRandomizer::getInstance().get()));
     for(std::deque<size_t>::const_iterator bitr = missingBlockIndexes.begin();
     for(std::deque<size_t>::const_iterator bitr = missingBlockIndexes.begin();
 	bitr != missingBlockIndexes.end() && requests.size() < max; bitr++) {
 	bitr != missingBlockIndexes.end() && requests.size() < max; bitr++) {
       size_t blockIndex = *bitr;
       size_t blockIndex = *bitr;

+ 6 - 2
src/MetalinkEntry.cc

@@ -33,6 +33,9 @@
  */
  */
 /* copyright --> */
 /* copyright --> */
 #include "MetalinkEntry.h"
 #include "MetalinkEntry.h"
+
+#include <algorithm>
+
 #include "MetalinkResource.h"
 #include "MetalinkResource.h"
 #include "FileEntry.h"
 #include "FileEntry.h"
 #include "Util.h"
 #include "Util.h"
@@ -42,7 +45,7 @@
 # include "ChunkChecksum.h"
 # include "ChunkChecksum.h"
 #endif // ENABLE_MESSAGE_DIGEST
 #endif // ENABLE_MESSAGE_DIGEST
 #include "Signature.h"
 #include "Signature.h"
-#include <algorithm>
+#include "SimpleRandomizer.h"
 
 
 namespace aria2 {
 namespace aria2 {
 
 
@@ -138,7 +141,8 @@ public:
 };
 };
 
 
 void MetalinkEntry::reorderResourcesByPreference() {
 void MetalinkEntry::reorderResourcesByPreference() {
-  std::random_shuffle(resources.begin(), resources.end());
+  std::random_shuffle(resources.begin(), resources.end(),
+		      *(SimpleRandomizer::getInstance().get()));
   std::sort(resources.begin(), resources.end(), PrefOrder());
   std::sort(resources.begin(), resources.end(), PrefOrder());
 }
 }
 
 

+ 5 - 1
src/RarestPieceSelector.cc

@@ -33,8 +33,11 @@
  */
  */
 /* copyright --> */
 /* copyright --> */
 #include "RarestPieceSelector.h"
 #include "RarestPieceSelector.h"
+
 #include <algorithm>
 #include <algorithm>
 
 
+#include "SimpleRandomizer.h"
+
 namespace aria2 {
 namespace aria2 {
 
 
 PieceStat::PieceStat(size_t index):_order(0), _index(index), _count(0) {}
 PieceStat::PieceStat(size_t index):_order(0), _index(index), _count(0) {}
@@ -101,7 +104,8 @@ RarestPieceSelector::RarestPieceSelector(size_t pieceNum, bool randomShuffle):
   _sortedPieceStats = _pieceStats;
   _sortedPieceStats = _pieceStats;
   // we need some randomness in ordering.
   // we need some randomness in ordering.
   if(randomShuffle) {
   if(randomShuffle) {
-    std::random_shuffle(_sortedPieceStats.begin(), _sortedPieceStats.end());
+    std::random_shuffle(_sortedPieceStats.begin(), _sortedPieceStats.end(),
+			*(SimpleRandomizer::getInstance().get()));
   }
   }
   {
   {
     size_t order = 0;
     size_t order = 0;

+ 7 - 2
src/SimpleRandomizer.cc

@@ -40,9 +40,9 @@
 
 
 namespace aria2 {
 namespace aria2 {
 
 
-SharedHandle<Randomizer> SimpleRandomizer::_randomizer;
+SharedHandle<SimpleRandomizer> SimpleRandomizer::_randomizer;
 
 
-SharedHandle<Randomizer> SimpleRandomizer::getInstance()
+SharedHandle<SimpleRandomizer> SimpleRandomizer::getInstance()
 {
 {
   if(_randomizer.isNull()) {
   if(_randomizer.isNull()) {
     _randomizer.reset(new SimpleRandomizer());
     _randomizer.reset(new SimpleRandomizer());
@@ -74,4 +74,9 @@ long int SimpleRandomizer::getRandomNumber(long int to)
   return(int32_t)(((double)to)*getRandomNumber()/(getMaxRandomNumber()+1.0));
   return(int32_t)(((double)to)*getRandomNumber()/(getMaxRandomNumber()+1.0));
 }
 }
 
 
+long int SimpleRandomizer::operator()(long int to)
+{
+  return getRandomNumber(to);
+}
+
 } // namespace aria2
 } // namespace aria2

+ 4 - 2
src/SimpleRandomizer.h

@@ -41,12 +41,12 @@ namespace aria2 {
 
 
 class SimpleRandomizer : public Randomizer {
 class SimpleRandomizer : public Randomizer {
 private:
 private:
-  static SharedHandle<Randomizer> _randomizer;
+  static SharedHandle<SimpleRandomizer> _randomizer;
 
 
   SimpleRandomizer();
   SimpleRandomizer();
 public:
 public:
   
   
-  static SharedHandle<Randomizer> getInstance();
+  static SharedHandle<SimpleRandomizer> getInstance();
   
   
   static void init();
   static void init();
 
 
@@ -60,6 +60,8 @@ public:
    * Returns random number in [0, to).
    * Returns random number in [0, to).
    */
    */
   virtual long int getRandomNumber(long int to);
   virtual long int getRandomNumber(long int to);
+
+  long int operator()(long int to);
 };
 };
 
 
 } // namespace aria2
 } // namespace aria2