From 7818e0e770f2f89d3f2356d887cf3d4559ddd7c3 Mon Sep 17 00:00:00 2001 From: Tatsuhiro Tsujikawa Date: Mon, 3 Nov 2008 07:16:25 +0000 Subject: [PATCH] 2008-11-03 Tatsuhiro Tsujikawa Implemented commented code in BtSeederStateChoke * src/BtSeederStateChoke.cc * src/Peer.cc * src/Peer.h * src/PeerInteractionCommand.cc * src/PeerSessionResource.cc * src/PeerSessionResource.h * test/MockBtMessageDispatcher.h * test/PeerSessionResourceTest.cc --- ChangeLog | 12 ++++++++++++ src/BtSeederStateChoke.cc | 15 +++++++-------- src/Peer.cc | 19 +++++++++++++++++-- src/Peer.h | 5 +++++ src/PeerInteractionCommand.cc | 1 + src/PeerSessionResource.cc | 18 +++++++++++++++++- src/PeerSessionResource.h | 7 +++++++ test/MockBtMessageDispatcher.h | 4 ++++ test/PeerSessionResourceTest.cc | 17 ++++++++++++++++- 9 files changed, 86 insertions(+), 12 deletions(-) diff --git a/ChangeLog b/ChangeLog index 070562a9..b4e8c2c4 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,15 @@ +2008-11-03 Tatsuhiro Tsujikawa + + Implemented commented code in BtSeederStateChoke + * src/BtSeederStateChoke.cc + * src/Peer.cc + * src/Peer.h + * src/PeerInteractionCommand.cc + * src/PeerSessionResource.cc + * src/PeerSessionResource.h + * test/MockBtMessageDispatcher.h + * test/PeerSessionResourceTest.cc + 2008-11-03 Tatsuhiro Tsujikawa Made BtRegistry non-static object. Now DownloadEngine has a reference to diff --git a/src/BtSeederStateChoke.cc b/src/BtSeederStateChoke.cc index cabc65e6..fe13c191 100644 --- a/src/BtSeederStateChoke.cc +++ b/src/BtSeederStateChoke.cc @@ -70,14 +70,13 @@ public: bool operator()(Peer* left, Peer* right) const { - // TODO Should peer have the reference to message dispatcher? -// size_t leftUpload = BT_MESSAGE_DISPATCHER(_btContext, left)->countOutstandingUpload(); -// size_t rightUpload = BT_MESSAGE_DISPATCHER(_btContext, right)->countOutstandingUpload(); -// if(leftUpload && !rightUpload) { -// return true; -// } else if(!leftUpload && rightUpload) { -// return false; -// } + size_t leftUpload = left->countOutstandingUpload(); + size_t rightUpload = right->countOutstandingUpload(); + if(leftUpload && !rightUpload) { + return true; + } else if(!leftUpload && rightUpload) { + return false; + } const int TIME_FRAME = 20; if(!left->getLastAmUnchoking().elapsed(TIME_FRAME) && left->getLastAmUnchoking().isNewer(right->getLastAmUnchoking())) { diff --git a/src/Peer.cc b/src/Peer.cc index ee9ac756..ec2413fe 100644 --- a/src/Peer.cc +++ b/src/Peer.cc @@ -33,13 +33,16 @@ */ /* copyright --> */ #include "Peer.h" + +#include +#include + #include "Util.h" #include "PeerSessionResource.h" #ifdef ENABLE_MESSAGE_DIGEST # include "MessageDigestHelper.h" #endif // ENABLE_MESSAGE_DIGEST -#include -#include +#include "BtMessageDispatcher.h" namespace aria2 { @@ -476,4 +479,16 @@ void Peer::setFirstContactTime(const Time& time) _firstContactTime = time; } +void Peer::setBtMessageDispatcher(const WeakHandle& dpt) +{ + assert(_res); + _res->setBtMessageDispatcher(dpt); +} + +size_t Peer::countOutstandingUpload() const +{ + assert(_res); + return _res->countOutstandingUpload(); +} + } // namespace aria2 diff --git a/src/Peer.h b/src/Peer.h index ff520364..899ca3c8 100644 --- a/src/Peer.h +++ b/src/Peer.h @@ -46,6 +46,7 @@ namespace aria2 { class PeerSessionResource; +class BtMessageDispatcher; class Peer { public: @@ -246,6 +247,10 @@ public: bool isIncomingPeer() const; void setIncomingPeer(bool incoming); + + void setBtMessageDispatcher(const WeakHandle& dpt); + + size_t countOutstandingUpload() const; }; typedef SharedHandle PeerHandle; diff --git a/src/PeerInteractionCommand.cc b/src/PeerInteractionCommand.cc index 50d9c7e8..406aad70 100644 --- a/src/PeerInteractionCommand.cc +++ b/src/PeerInteractionCommand.cc @@ -190,6 +190,7 @@ PeerInteractionCommand::PeerInteractionCommand setUploadLimit(e->option->getAsInt(PREF_MAX_UPLOAD_LIMIT)); peer->allocateSessionResource(_btContext->getPieceLength(), _btContext->getTotalLength()); + peer->setBtMessageDispatcher(dispatcher); maxDownloadSpeedLimit = e->option->getAsInt(PREF_MAX_DOWNLOAD_LIMIT); diff --git a/src/PeerSessionResource.cc b/src/PeerSessionResource.cc index c6436a3c..a35ceadb 100644 --- a/src/PeerSessionResource.cc +++ b/src/PeerSessionResource.cc @@ -33,10 +33,14 @@ */ /* copyright --> */ #include "PeerSessionResource.h" + +#include +#include + #include "BitfieldManFactory.h" #include "BitfieldMan.h" #include "A2STR.h" -#include +#include "BtMessageDispatcher.h" namespace aria2 { @@ -338,4 +342,16 @@ uint64_t PeerSessionResource::getCompletedLength() const return _bitfieldMan->getCompletedLength(); } +void PeerSessionResource::setBtMessageDispatcher +(const WeakHandle& dpt) +{ + _dispatcher = dpt; +} + +size_t PeerSessionResource::countOutstandingUpload() const +{ + assert(!_dispatcher.isNull()); + return _dispatcher->countOutstandingUpload(); +} + } // namespace aria2 diff --git a/src/PeerSessionResource.h b/src/PeerSessionResource.h index c25eb9fb..f0828c0e 100644 --- a/src/PeerSessionResource.h +++ b/src/PeerSessionResource.h @@ -45,6 +45,7 @@ namespace aria2 { class BitfieldMan; +class BtMessageDispatcher; class PeerSessionResource { private: @@ -78,6 +79,8 @@ private: Time _lastDownloadUpdate; Time _lastAmUnchoking; + + WeakHandle _dispatcher; public: PeerSessionResource(size_t pieceLength, uint64_t totalLength); @@ -185,6 +188,10 @@ public: const Time& getLastAmUnchoking() const; uint64_t getCompletedLength() const; + + void setBtMessageDispatcher(const WeakHandle& dpt); + + size_t countOutstandingUpload() const; }; } // namespace aria2 diff --git a/test/MockBtMessageDispatcher.h b/test/MockBtMessageDispatcher.h index 81aeff5a..5ab3f916 100644 --- a/test/MockBtMessageDispatcher.h +++ b/test/MockBtMessageDispatcher.h @@ -2,8 +2,12 @@ #define _D_MOCK_BT_MESSAGE_DISPATCHER_H_ #include "BtMessageDispatcher.h" + #include +#include "BtMessage.h" +#include "Piece.h" + namespace aria2 { class MockBtMessageDispatcher : public BtMessageDispatcher { diff --git a/test/PeerSessionResourceTest.cc b/test/PeerSessionResourceTest.cc index 91908469..f7a8a767 100644 --- a/test/PeerSessionResourceTest.cc +++ b/test/PeerSessionResourceTest.cc @@ -1,7 +1,10 @@ #include "PeerSessionResource.h" + +#include + +#include "MockBtMessageDispatcher.h" #include "Exception.h" #include "Util.h" -#include namespace aria2 { @@ -26,6 +29,7 @@ class PeerSessionResourceTest:public CppUnit::TestFixture { CPPUNIT_TEST(testChokingRequired); CPPUNIT_TEST(testOptUnchoking); CPPUNIT_TEST(testShouldBeChoking); + CPPUNIT_TEST(testCountOutstandingRequest); CPPUNIT_TEST_SUITE_END(); public: void setUp() {} @@ -50,6 +54,7 @@ public: void testChokingRequired(); void testOptUnchoking(); void testShouldBeChoking(); + void testCountOutstandingRequest(); }; @@ -251,4 +256,14 @@ void PeerSessionResourceTest::testShouldBeChoking() CPPUNIT_ASSERT(!res.shouldBeChoking()); } +void PeerSessionResourceTest::testCountOutstandingRequest() +{ + PeerSessionResource res(1024, 1024*1024); + SharedHandle dispatcher + (new MockBtMessageDispatcher()); + res.setBtMessageDispatcher(dispatcher); + + CPPUNIT_ASSERT_EQUAL((size_t)0, res.countOutstandingUpload()); +} + } // namespace aria2