summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2008-11-16 04:25:24 +0000
committerTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2008-11-16 04:25:24 +0000
commit9b71a5d0b55c5f840298a3385f52a71509dce02b (patch)
treeedf254e46746e631b2ef4d1dc8558114eec92aeb /src
parenta3bfe5c504d2c2f9594632647173b7108081ae97 (diff)
2008-11-15 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>
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
Diffstat (limited to 'src')
-rw-r--r--src/AnnounceList.cc8
-rw-r--r--src/BtLeecherStateChoke.cc11
-rw-r--r--src/BtSeederStateChoke.cc5
-rw-r--r--src/DefaultBtRequestFactory.cc4
-rw-r--r--src/MetalinkEntry.cc8
-rw-r--r--src/RarestPieceSelector.cc6
-rw-r--r--src/SimpleRandomizer.cc9
-rw-r--r--src/SimpleRandomizer.h6
8 files changed, 43 insertions, 14 deletions
diff --git a/src/AnnounceList.cc b/src/AnnounceList.cc
index 6629133b..ffdba076 100644
--- a/src/AnnounceList.cc
+++ b/src/AnnounceList.cc
@@ -33,10 +33,13 @@
*/
/* copyright --> */
#include "AnnounceList.h"
+
+#include <algorithm>
+
#include "List.h"
#include "Data.h"
#include "A2STR.h"
-#include <algorithm>
+#include "SimpleRandomizer.h"
namespace aria2 {
@@ -238,7 +241,8 @@ void AnnounceList::shuffle() {
for(AnnounceTiers::iterator itr = tiers.begin();
itr != tiers.end(); itr++) {
std::deque<std::string>& urls = (*itr)->urls;
- random_shuffle(urls.begin(), urls.end());
+ std::random_shuffle(urls.begin(), urls.end(),
+ *(SimpleRandomizer::getInstance().get()));
}
}
diff --git a/src/BtLeecherStateChoke.cc b/src/BtLeecherStateChoke.cc
index f72a4c35..71933c9c 100644
--- a/src/BtLeecherStateChoke.cc
+++ b/src/BtLeecherStateChoke.cc
@@ -33,11 +33,14 @@
*/
/* copyright --> */
#include "BtLeecherStateChoke.h"
+
+#include <algorithm>
+
#include "Peer.h"
#include "Logger.h"
#include "LogFactory.h"
#include "a2time.h"
-#include <algorithm>
+#include "SimpleRandomizer.h"
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));
if(i != peers.begin()) {
- std::random_shuffle(peers.begin(), i);
+ std::random_shuffle(peers.begin(), i,
+ *(SimpleRandomizer::getInstance().get()));
(*peers.begin())->optUnchoking(true);
_logger->info("POU: %s", (*peers.begin())->ipaddr.c_str());
}
@@ -130,7 +134,8 @@ void BtLeecherStateChoke::regularUnchoke(std::deque<Peer*>& peers)
}
}
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) {
if((*i)->peerInterested()) {
(*i)->optUnchoking(true);
diff --git a/src/BtSeederStateChoke.cc b/src/BtSeederStateChoke.cc
index fe13c191..539df5e8 100644
--- a/src/BtSeederStateChoke.cc
+++ b/src/BtSeederStateChoke.cc
@@ -47,6 +47,7 @@
#include "Logger.h"
#include "LogFactory.h"
#include "a2time.h"
+#include "SimpleRandomizer.h"
namespace aria2 {
@@ -113,7 +114,9 @@ void BtSeederStateChoke::unchoke(std::deque<Peer*>& peers)
(*r)->calculateUploadSpeed(now));
}
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);
_logger->info("POU: %s", (*r)->ipaddr.c_str());
}
diff --git a/src/DefaultBtRequestFactory.cc b/src/DefaultBtRequestFactory.cc
index 87fbd411..2a272437 100644
--- a/src/DefaultBtRequestFactory.cc
+++ b/src/DefaultBtRequestFactory.cc
@@ -46,6 +46,7 @@
#include "BtMessageFactory.h"
#include "BtMessage.h"
#include "a2functional.h"
+#include "SimpleRandomizer.h"
namespace aria2 {
@@ -171,7 +172,8 @@ void DefaultBtRequestFactory::createRequestMessagesOnEndGame
PieceHandle& piece = *itr;
std::deque<size_t> 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();
bitr != missingBlockIndexes.end() && requests.size() < max; bitr++) {
size_t blockIndex = *bitr;
diff --git a/src/MetalinkEntry.cc b/src/MetalinkEntry.cc
index 04fc0abc..60bebcb9 100644
--- a/src/MetalinkEntry.cc
+++ b/src/MetalinkEntry.cc
@@ -33,6 +33,9 @@
*/
/* copyright --> */
#include "MetalinkEntry.h"
+
+#include <algorithm>
+
#include "MetalinkResource.h"
#include "FileEntry.h"
#include "Util.h"
@@ -42,7 +45,7 @@
# include "ChunkChecksum.h"
#endif // ENABLE_MESSAGE_DIGEST
#include "Signature.h"
-#include <algorithm>
+#include "SimpleRandomizer.h"
namespace aria2 {
@@ -138,7 +141,8 @@ public:
};
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());
}
diff --git a/src/RarestPieceSelector.cc b/src/RarestPieceSelector.cc
index 37d2c20d..efe79774 100644
--- a/src/RarestPieceSelector.cc
+++ b/src/RarestPieceSelector.cc
@@ -33,8 +33,11 @@
*/
/* copyright --> */
#include "RarestPieceSelector.h"
+
#include <algorithm>
+#include "SimpleRandomizer.h"
+
namespace aria2 {
PieceStat::PieceStat(size_t index):_order(0), _index(index), _count(0) {}
@@ -101,7 +104,8 @@ RarestPieceSelector::RarestPieceSelector(size_t pieceNum, bool randomShuffle):
_sortedPieceStats = _pieceStats;
// we need some randomness in ordering.
if(randomShuffle) {
- std::random_shuffle(_sortedPieceStats.begin(), _sortedPieceStats.end());
+ std::random_shuffle(_sortedPieceStats.begin(), _sortedPieceStats.end(),
+ *(SimpleRandomizer::getInstance().get()));
}
{
size_t order = 0;
diff --git a/src/SimpleRandomizer.cc b/src/SimpleRandomizer.cc
index 760dafb5..f3aba6bc 100644
--- a/src/SimpleRandomizer.cc
+++ b/src/SimpleRandomizer.cc
@@ -40,9 +40,9 @@
namespace aria2 {
-SharedHandle<Randomizer> SimpleRandomizer::_randomizer;
+SharedHandle<SimpleRandomizer> SimpleRandomizer::_randomizer;
-SharedHandle<Randomizer> SimpleRandomizer::getInstance()
+SharedHandle<SimpleRandomizer> SimpleRandomizer::getInstance()
{
if(_randomizer.isNull()) {
_randomizer.reset(new SimpleRandomizer());
@@ -74,4 +74,9 @@ long int SimpleRandomizer::getRandomNumber(long int to)
return(int32_t)(((double)to)*getRandomNumber()/(getMaxRandomNumber()+1.0));
}
+long int SimpleRandomizer::operator()(long int to)
+{
+ return getRandomNumber(to);
+}
+
} // namespace aria2
diff --git a/src/SimpleRandomizer.h b/src/SimpleRandomizer.h
index 4d732fbc..62b4f79c 100644
--- a/src/SimpleRandomizer.h
+++ b/src/SimpleRandomizer.h
@@ -41,12 +41,12 @@ namespace aria2 {
class SimpleRandomizer : public Randomizer {
private:
- static SharedHandle<Randomizer> _randomizer;
+ static SharedHandle<SimpleRandomizer> _randomizer;
SimpleRandomizer();
public:
- static SharedHandle<Randomizer> getInstance();
+ static SharedHandle<SimpleRandomizer> getInstance();
static void init();
@@ -60,6 +60,8 @@ public:
* Returns random number in [0, to).
*/
virtual long int getRandomNumber(long int to);
+
+ long int operator()(long int to);
};
} // namespace aria2