summaryrefslogtreecommitdiff
path: root/src/PeerInteractionCommand.cc
diff options
context:
space:
mode:
authorTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2011-01-08 17:32:16 +0900
committerTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2011-01-09 18:34:06 +0900
commitce2d401dce35b94c15120a4cac441a4614658e3d (patch)
treed45875f961f3dcfdb5c7ad96419ef15886fd983e /src/PeerInteractionCommand.cc
parentc48db2cdf3c194a979bb90e856914225b8ad02ca (diff)
Eliminated SocketCore::peekData from MSEHandshake.
Diffstat (limited to 'src/PeerInteractionCommand.cc')
-rw-r--r--src/PeerInteractionCommand.cc118
1 files changed, 66 insertions, 52 deletions
diff --git a/src/PeerInteractionCommand.cc b/src/PeerInteractionCommand.cc
index dece90a8..bb8ea4bb 100644
--- a/src/PeerInteractionCommand.cc
+++ b/src/PeerInteractionCommand.cc
@@ -163,6 +163,11 @@ PeerInteractionCommand::PeerInteractionCommand
peerConnection.reset(new PeerConnection(cuid, getPeer(), getSocket()));
} else {
peerConnection = passedPeerConnection;
+ if(sequence_ == RECEIVER_WAIT_HANDSHAKE &&
+ peerConnection->getBufferLength() > 0) {
+ setStatus(Command::STATUS_ONESHOT_REALTIME);
+ getDownloadEngine()->setNoWait(true);
+ }
}
SharedHandle<DefaultBtMessageDispatcher> dispatcher
@@ -274,71 +279,80 @@ PeerInteractionCommand::~PeerInteractionCommand() {
bool PeerInteractionCommand::executeInternal() {
setNoCheck(false);
- switch(sequence_) {
- case INITIATOR_SEND_HANDSHAKE:
- if(!getSocket()->isWritable(0)) {
+ bool done = false;
+ while(!done) {
+ switch(sequence_) {
+ case INITIATOR_SEND_HANDSHAKE:
+ if(!getSocket()->isWritable(0)) {
+ done = true;
+ break;
+ }
+ disableWriteCheckSocket();
+ setReadCheckSocket(getSocket());
+ //socket->setBlockingMode();
+ setTimeout(getOption()->getAsInt(PREF_BT_TIMEOUT));
+ btInteractive_->initiateHandshake();
+ sequence_ = INITIATOR_WAIT_HANDSHAKE;
break;
- }
- disableWriteCheckSocket();
- setReadCheckSocket(getSocket());
- //socket->setBlockingMode();
- setTimeout(getOption()->getAsInt(PREF_BT_TIMEOUT));
- btInteractive_->initiateHandshake();
- sequence_ = INITIATOR_WAIT_HANDSHAKE;
- break;
- case INITIATOR_WAIT_HANDSHAKE: {
- if(btInteractive_->countPendingMessage() > 0) {
- btInteractive_->sendPendingMessage();
+ case INITIATOR_WAIT_HANDSHAKE: {
if(btInteractive_->countPendingMessage() > 0) {
+ btInteractive_->sendPendingMessage();
+ if(btInteractive_->countPendingMessage() > 0) {
+ done = true;
+ break;
+ }
+ }
+ BtMessageHandle handshakeMessage = btInteractive_->receiveHandshake();
+ if(!handshakeMessage) {
+ done = true;
break;
}
- }
- BtMessageHandle handshakeMessage = btInteractive_->receiveHandshake();
- if(!handshakeMessage) {
+ btInteractive_->doPostHandshakeProcessing();
+ sequence_ = WIRED;
break;
}
- btInteractive_->doPostHandshakeProcessing();
- sequence_ = WIRED;
- break;
- }
- case RECEIVER_WAIT_HANDSHAKE: {
- BtMessageHandle handshakeMessage =btInteractive_->receiveAndSendHandshake();
- if(!handshakeMessage) {
+ case RECEIVER_WAIT_HANDSHAKE: {
+ BtMessageHandle handshakeMessage =
+ btInteractive_->receiveAndSendHandshake();
+ if(!handshakeMessage) {
+ done = true;
+ break;
+ }
+ btInteractive_->doPostHandshakeProcessing();
+ sequence_ = WIRED;
break;
}
- btInteractive_->doPostHandshakeProcessing();
- sequence_ = WIRED;
- break;
- }
- case WIRED:
- // See the comment for writable check below.
- disableWriteCheckSocket();
-
- btInteractive_->doInteractionProcessing();
- if(btInteractive_->countReceivedMessageInIteration() > 0) {
- updateKeepAlive();
- }
- if((getPeer()->amInterested() && !getPeer()->peerChoking()) ||
- btInteractive_->countOutstandingRequest() ||
- (getPeer()->peerInterested() && !getPeer()->amChoking())) {
+ case WIRED:
+ // See the comment for writable check below.
+ disableWriteCheckSocket();
- // Writable check to avoid slow seeding
- if(btInteractive_->isSendingMessageInProgress()) {
- setWriteCheckSocket(getSocket());
+ btInteractive_->doInteractionProcessing();
+ if(btInteractive_->countReceivedMessageInIteration() > 0) {
+ updateKeepAlive();
}
-
- if(getDownloadEngine()->getRequestGroupMan()->
- doesOverallDownloadSpeedExceed() ||
- requestGroup_->doesDownloadSpeedExceed()) {
- disableReadCheckSocket();
- setNoCheck(true);
+ if((getPeer()->amInterested() && !getPeer()->peerChoking()) ||
+ btInteractive_->countOutstandingRequest() ||
+ (getPeer()->peerInterested() && !getPeer()->amChoking())) {
+
+ // Writable check to avoid slow seeding
+ if(btInteractive_->isSendingMessageInProgress()) {
+ setWriteCheckSocket(getSocket());
+ }
+
+ if(getDownloadEngine()->getRequestGroupMan()->
+ doesOverallDownloadSpeedExceed() ||
+ requestGroup_->doesDownloadSpeedExceed()) {
+ disableReadCheckSocket();
+ setNoCheck(true);
+ } else {
+ setReadCheckSocket(getSocket());
+ }
} else {
- setReadCheckSocket(getSocket());
+ disableReadCheckSocket();
}
- } else {
- disableReadCheckSocket();
+ done = true;
+ break;
}
- break;
}
if(btInteractive_->countPendingMessage() > 0) {
setNoCheck(true);