From f38eb15ca9720df6ce917eebfb92035a731acaeb Mon Sep 17 00:00:00 2001 From: Tatsuhiro Tsujikawa Date: Fri, 8 Feb 2008 18:27:28 +0000 Subject: [PATCH] 2008-02-09 Tatsuhiro Tsujikawa Only add socket to DownloadEngine's select routine when peer or localhost is unchoked and interested. This lowers CPU usage a little bit. * src/PeerInteractionCommand.cc * src/PeerAbstractCommand.{h, cc} * src/BtInteractive.h * src/DefaultBtInteractive.{h, cc} --- ChangeLog | 10 ++++++++++ src/BtInteractive.h | 2 ++ src/DefaultBtInteractive.cc | 15 ++++++++++++--- src/DefaultBtInteractive.h | 6 +++++- src/PeerAbstractCommand.cc | 5 +++++ src/PeerAbstractCommand.h | 1 + src/PeerInteractionCommand.cc | 33 +++++++++++++++++++++------------ 7 files changed, 56 insertions(+), 16 deletions(-) diff --git a/ChangeLog b/ChangeLog index 770afa24..bde0d759 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,13 @@ +2008-02-09 Tatsuhiro Tsujikawa + + Only add socket to DownloadEngine's select routine when peer or + localhost is unchoked and interested. This lowers CPU usage a + little bit. + * src/PeerInteractionCommand.cc + * src/PeerAbstractCommand.{h, cc} + * src/BtInteractive.h + * src/DefaultBtInteractive.{h, cc} + 2008-02-09 Tatsuhiro Tsujikawa Revert previous change because get_peers message is needed for diff --git a/src/BtInteractive.h b/src/BtInteractive.h index abffb98e..cb97a0c4 100644 --- a/src/BtInteractive.h +++ b/src/BtInteractive.h @@ -63,6 +63,8 @@ public: virtual int32_t countPendingMessage() = 0; virtual bool isSendingMessageInProgress() = 0; + + virtual size_t countReceivedMessageInIteration() const = 0; }; typedef SharedHandle BtInteractiveHandle; diff --git a/src/DefaultBtInteractive.cc b/src/DefaultBtInteractive.cc index eb93ecfc..f1b2a695 100644 --- a/src/DefaultBtInteractive.cc +++ b/src/DefaultBtInteractive.cc @@ -75,7 +75,8 @@ DefaultBtInteractive::DefaultBtInteractive(const SharedHandle& btCont keepAliveInterval(120), maxDownloadSpeedLimit(0), _utPexEnabled(false), - _dhtEnabled(false) + _dhtEnabled(false), + _numReceivedMessage(0) {} DefaultBtInteractive::~DefaultBtInteractive() {} @@ -222,7 +223,8 @@ void DefaultBtInteractive::sendKeepAlive() { } } -void DefaultBtInteractive::receiveMessages() { +size_t DefaultBtInteractive::receiveMessages() { + size_t msgcount = 0; for(int i = 0; i < 50; i++) { if(maxDownloadSpeedLimit > 0) { TransferStat stat = peerStorage->calculateStat(); @@ -234,6 +236,7 @@ void DefaultBtInteractive::receiveMessages() { if(message.isNull()) { break; } + ++msgcount; logger->info(MSG_RECEIVE_PEER_MESSAGE, cuid, peer->ipaddr.c_str(), peer->port, message->toString().c_str()); @@ -259,6 +262,7 @@ void DefaultBtInteractive::receiveMessages() { break; } } + return msgcount; } void DefaultBtInteractive::decideInterest() { @@ -415,7 +419,7 @@ void DefaultBtInteractive::doInteractionProcessing() { sendKeepAlive(); - receiveMessages(); + _numReceivedMessage = receiveMessages(); btRequestFactory->removeCompletedPiece(); @@ -446,6 +450,11 @@ bool DefaultBtInteractive::isSendingMessageInProgress() return dispatcher->isSendingInProgress(); } +size_t DefaultBtInteractive::countReceivedMessageInIteration() const +{ + return _numReceivedMessage; +} + void DefaultBtInteractive::setPeer(const SharedHandle& peer) { this->peer = peer; diff --git a/src/DefaultBtInteractive.h b/src/DefaultBtInteractive.h index 6b4d6670..a70ae31f 100644 --- a/src/DefaultBtInteractive.h +++ b/src/DefaultBtInteractive.h @@ -110,6 +110,8 @@ private: bool _utPexEnabled; bool _dhtEnabled; + size_t _numReceivedMessage; + static const int32_t FLOODING_CHECK_INTERVAL = 5; void addBitfieldMessageToQueue(); @@ -146,12 +148,14 @@ public: virtual void sendPendingMessage(); - void receiveMessages(); + size_t receiveMessages(); virtual int32_t countPendingMessage(); virtual bool isSendingMessageInProgress(); + virtual size_t countReceivedMessageInIteration() const; + void setCuid(int32_t cuid) { this->cuid = cuid; } diff --git a/src/PeerAbstractCommand.cc b/src/PeerAbstractCommand.cc index c46e5d34..42fb8e9c 100644 --- a/src/PeerAbstractCommand.cc +++ b/src/PeerAbstractCommand.cc @@ -174,4 +174,9 @@ void PeerAbstractCommand::setNoCheck(bool check) { this->noCheck = check; } +void PeerAbstractCommand::updateKeepAlive() +{ + checkPoint.reset(); +} + } // namespace aria2 diff --git a/src/PeerAbstractCommand.h b/src/PeerAbstractCommand.h index 381c4223..e75fd954 100644 --- a/src/PeerAbstractCommand.h +++ b/src/PeerAbstractCommand.h @@ -68,6 +68,7 @@ protected: void setUploadLimit(int32_t uploadLimit); void setUploadLimitCheck(bool check); void setNoCheck(bool check); + void updateKeepAlive(); private: bool checkSocketIsReadable; bool checkSocketIsWritable; diff --git a/src/PeerInteractionCommand.cc b/src/PeerInteractionCommand.cc index 160ad5e6..87e6bf52 100644 --- a/src/PeerInteractionCommand.cc +++ b/src/PeerInteractionCommand.cc @@ -174,17 +174,15 @@ PeerInteractionCommand::~PeerInteractionCommand() { } bool PeerInteractionCommand::executeInternal() { - setReadCheckSocket(socket); - disableWriteCheckSocket(); setUploadLimitCheck(false); setNoCheck(false); switch(sequence) { case INITIATOR_SEND_HANDSHAKE: if(!socket->isWritable(0)) { - disableReadCheckSocket(); - setWriteCheckSocket(socket); break; } + disableWriteCheckSocket(); + setReadCheckSocket(socket); socket->setBlockingMode(); setTimeout(e->option->getAsInt(PREF_BT_TIMEOUT)); btInteractive->initiateHandshake(); @@ -216,19 +214,30 @@ bool PeerInteractionCommand::executeInternal() { } case WIRED: btInteractive->doInteractionProcessing(); - + if(btInteractive->countReceivedMessageInIteration() > 0) { + updateKeepAlive(); + } + if(peer->amInterested && !peer->peerChoking || + peer->peerInterested && !peer->amChoking) { + if(maxDownloadSpeedLimit > 0) { + TransferStat stat = peerStorage->calculateStat(); + if(maxDownloadSpeedLimit < stat.downloadSpeed) { + disableReadCheckSocket(); + setNoCheck(true); + } else { + setReadCheckSocket(socket); + } + } else { + setReadCheckSocket(socket); + } + } else { + disableReadCheckSocket(); + } break; } if(btInteractive->countPendingMessage() > 0) { setNoCheck(true); } - if(maxDownloadSpeedLimit > 0) { - TransferStat stat = peerStorage->calculateStat(); - if(maxDownloadSpeedLimit < stat.downloadSpeed) { - disableReadCheckSocket(); - setNoCheck(true); - } - } e->commands.push_back(this); return false; }