2008-02-09 Tatsuhiro Tsujikawa <tujikawa at rednoah dot com>

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}
pull/1/head
Tatsuhiro Tsujikawa 2008-02-08 18:27:28 +00:00
parent 9ab0ece87f
commit f38eb15ca9
7 changed files with 56 additions and 16 deletions

View File

@ -1,3 +1,13 @@
2008-02-09 Tatsuhiro Tsujikawa <tujikawa at rednoah dot com>
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 <tujikawa at rednoah dot com> 2008-02-09 Tatsuhiro Tsujikawa <tujikawa at rednoah dot com>
Revert previous change because get_peers message is needed for Revert previous change because get_peers message is needed for

View File

@ -63,6 +63,8 @@ public:
virtual int32_t countPendingMessage() = 0; virtual int32_t countPendingMessage() = 0;
virtual bool isSendingMessageInProgress() = 0; virtual bool isSendingMessageInProgress() = 0;
virtual size_t countReceivedMessageInIteration() const = 0;
}; };
typedef SharedHandle<BtInteractive> BtInteractiveHandle; typedef SharedHandle<BtInteractive> BtInteractiveHandle;

View File

@ -75,7 +75,8 @@ DefaultBtInteractive::DefaultBtInteractive(const SharedHandle<BtContext>& btCont
keepAliveInterval(120), keepAliveInterval(120),
maxDownloadSpeedLimit(0), maxDownloadSpeedLimit(0),
_utPexEnabled(false), _utPexEnabled(false),
_dhtEnabled(false) _dhtEnabled(false),
_numReceivedMessage(0)
{} {}
DefaultBtInteractive::~DefaultBtInteractive() {} 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++) { for(int i = 0; i < 50; i++) {
if(maxDownloadSpeedLimit > 0) { if(maxDownloadSpeedLimit > 0) {
TransferStat stat = peerStorage->calculateStat(); TransferStat stat = peerStorage->calculateStat();
@ -234,6 +236,7 @@ void DefaultBtInteractive::receiveMessages() {
if(message.isNull()) { if(message.isNull()) {
break; break;
} }
++msgcount;
logger->info(MSG_RECEIVE_PEER_MESSAGE, cuid, logger->info(MSG_RECEIVE_PEER_MESSAGE, cuid,
peer->ipaddr.c_str(), peer->port, peer->ipaddr.c_str(), peer->port,
message->toString().c_str()); message->toString().c_str());
@ -259,6 +262,7 @@ void DefaultBtInteractive::receiveMessages() {
break; break;
} }
} }
return msgcount;
} }
void DefaultBtInteractive::decideInterest() { void DefaultBtInteractive::decideInterest() {
@ -415,7 +419,7 @@ void DefaultBtInteractive::doInteractionProcessing() {
sendKeepAlive(); sendKeepAlive();
receiveMessages(); _numReceivedMessage = receiveMessages();
btRequestFactory->removeCompletedPiece(); btRequestFactory->removeCompletedPiece();
@ -446,6 +450,11 @@ bool DefaultBtInteractive::isSendingMessageInProgress()
return dispatcher->isSendingInProgress(); return dispatcher->isSendingInProgress();
} }
size_t DefaultBtInteractive::countReceivedMessageInIteration() const
{
return _numReceivedMessage;
}
void DefaultBtInteractive::setPeer(const SharedHandle<Peer>& peer) void DefaultBtInteractive::setPeer(const SharedHandle<Peer>& peer)
{ {
this->peer = peer; this->peer = peer;

View File

@ -110,6 +110,8 @@ private:
bool _utPexEnabled; bool _utPexEnabled;
bool _dhtEnabled; bool _dhtEnabled;
size_t _numReceivedMessage;
static const int32_t FLOODING_CHECK_INTERVAL = 5; static const int32_t FLOODING_CHECK_INTERVAL = 5;
void addBitfieldMessageToQueue(); void addBitfieldMessageToQueue();
@ -146,12 +148,14 @@ public:
virtual void sendPendingMessage(); virtual void sendPendingMessage();
void receiveMessages(); size_t receiveMessages();
virtual int32_t countPendingMessage(); virtual int32_t countPendingMessage();
virtual bool isSendingMessageInProgress(); virtual bool isSendingMessageInProgress();
virtual size_t countReceivedMessageInIteration() const;
void setCuid(int32_t cuid) { void setCuid(int32_t cuid) {
this->cuid = cuid; this->cuid = cuid;
} }

View File

@ -174,4 +174,9 @@ void PeerAbstractCommand::setNoCheck(bool check) {
this->noCheck = check; this->noCheck = check;
} }
void PeerAbstractCommand::updateKeepAlive()
{
checkPoint.reset();
}
} // namespace aria2 } // namespace aria2

View File

@ -68,6 +68,7 @@ protected:
void setUploadLimit(int32_t uploadLimit); void setUploadLimit(int32_t uploadLimit);
void setUploadLimitCheck(bool check); void setUploadLimitCheck(bool check);
void setNoCheck(bool check); void setNoCheck(bool check);
void updateKeepAlive();
private: private:
bool checkSocketIsReadable; bool checkSocketIsReadable;
bool checkSocketIsWritable; bool checkSocketIsWritable;

View File

@ -174,17 +174,15 @@ PeerInteractionCommand::~PeerInteractionCommand() {
} }
bool PeerInteractionCommand::executeInternal() { bool PeerInteractionCommand::executeInternal() {
setReadCheckSocket(socket);
disableWriteCheckSocket();
setUploadLimitCheck(false); setUploadLimitCheck(false);
setNoCheck(false); setNoCheck(false);
switch(sequence) { switch(sequence) {
case INITIATOR_SEND_HANDSHAKE: case INITIATOR_SEND_HANDSHAKE:
if(!socket->isWritable(0)) { if(!socket->isWritable(0)) {
disableReadCheckSocket();
setWriteCheckSocket(socket);
break; break;
} }
disableWriteCheckSocket();
setReadCheckSocket(socket);
socket->setBlockingMode(); socket->setBlockingMode();
setTimeout(e->option->getAsInt(PREF_BT_TIMEOUT)); setTimeout(e->option->getAsInt(PREF_BT_TIMEOUT));
btInteractive->initiateHandshake(); btInteractive->initiateHandshake();
@ -216,19 +214,30 @@ bool PeerInteractionCommand::executeInternal() {
} }
case WIRED: case WIRED:
btInteractive->doInteractionProcessing(); 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; break;
} }
if(btInteractive->countPendingMessage() > 0) { if(btInteractive->countPendingMessage() > 0) {
setNoCheck(true); setNoCheck(true);
} }
if(maxDownloadSpeedLimit > 0) {
TransferStat stat = peerStorage->calculateStat();
if(maxDownloadSpeedLimit < stat.downloadSpeed) {
disableReadCheckSocket();
setNoCheck(true);
}
}
e->commands.push_back(this); e->commands.push_back(this);
return false; return false;
} }