Fix bug in the client that caused signaling messages to be dropped.

Also fixing potential out-of-order delivery of signaling messages.
Review URL: http://webrtc-codereview.appspot.com/214005

git-svn-id: http://webrtc.googlecode.com/svn/trunk@716 4adac7df-926f-26a2-2b94-8c16560cd09d
This commit is contained in:
tommi@webrtc.org 2011-10-10 08:16:26 +00:00
parent d855bd4d6f
commit 5a695d6094
2 changed files with 21 additions and 17 deletions

View File

@ -326,26 +326,27 @@ void Conductor::UIThreadCallback(int msg_id, void* data) {
case SEND_MESSAGE_TO_PEER: {
LOG(INFO) << "SEND_MESSAGE_TO_PEER";
std::string* msg = reinterpret_cast<std::string*>(data);
if (client_->IsSendingMessage()) {
ASSERT(msg != NULL);
if (msg) {
// For convenience, we always run the message through the queue.
// This way we can be sure that messages are sent to the server
// in the same order they were signaled without much hassle.
pending_messages_.push_back(msg);
} else {
if (!msg && !pending_messages_.empty()) {
msg = pending_messages_.front();
pending_messages_.pop_front();
}
if (msg) {
bool ok = client_->SendToPeer(peer_id_, *msg);
if (!ok && peer_id_ != -1) {
LOG(LS_ERROR) << "SendToPeer failed";
DisconnectFromServer();
}
delete msg;
}
if (!pending_messages_.empty() && !client_->IsSendingMessage()) {
msg = pending_messages_.front();
pending_messages_.pop_front();
if (!client_->SendToPeer(peer_id_, *msg) && peer_id_ != -1) {
LOG(LS_ERROR) << "SendToPeer failed";
DisconnectFromServer();
}
if (!peer_connection_.get())
peer_id_ = -1;
delete msg;
}
if (!peer_connection_.get())
peer_id_ = -1;
break;
}

View File

@ -289,6 +289,9 @@ bool PeerConnectionClient::ReadIntoBuffer(talk_base::AsyncSocket* socket,
if (GetHeaderValue(*data, i, kConnection, &should_close) &&
should_close.compare("close") == 0) {
socket->Close();
// Since we closed the socket, there was no notification delivered
// to us. Compensate by letting ourselves know.
OnClose(socket, NO_ERROR);
}
} else {
// We haven't received everything. Just continue to accept data.
@ -472,7 +475,7 @@ void PeerConnectionClient::OnClose(talk_base::AsyncSocket* socket, int err) {
callback_->OnMessageSent(err);
}
} else {
// Failed to connect to the server.
LOG(WARNING) << "Failed to connect to the server";
Close();
callback_->OnDisconnected();
}