Index: net/tools/quic/quic_dispatcher.cc |
diff --git a/net/tools/quic/quic_dispatcher.cc b/net/tools/quic/quic_dispatcher.cc |
index 21070169a979d8e1f082f78bdddc1637be4db411..e684138f46a00f642480bee5936c47010f089100 100644 |
--- a/net/tools/quic/quic_dispatcher.cc |
+++ b/net/tools/quic/quic_dispatcher.cc |
@@ -132,7 +132,6 @@ QuicDispatcher::QuicDispatcher(const QuicConfig& config, |
delete_sessions_alarm_(new DeleteSessionsAlarm(this)), |
epoll_server_(epoll_server), |
fd_(fd), |
- write_blocked_(false), |
helper_(new QuicEpollConnectionHelper(epoll_server_)), |
writer_(new QuicDefaultPacketWriter(fd)), |
supported_versions_(supported_versions), |
@@ -152,11 +151,13 @@ void QuicDispatcher::set_fd(int fd) { |
writer_.reset(new QuicDefaultPacketWriter(fd)); |
} |
+// TODO(fnk): remove the Writer interface implementation in favor of |
+// direct requests for blocked list placement from Connection/Session. |
WriteResult QuicDispatcher::WritePacket(const char* buffer, size_t buf_len, |
const IPAddressNumber& self_address, |
const IPEndPoint& peer_address, |
QuicBlockedWriterInterface* writer) { |
- if (write_blocked_) { |
+ if (IsWriteBlocked()) { |
write_blocked_list_.insert(make_pair(writer, true)); |
return WriteResult(WRITE_STATUS_BLOCKED, EAGAIN); |
} |
@@ -164,8 +165,8 @@ WriteResult QuicDispatcher::WritePacket(const char* buffer, size_t buf_len, |
WriteResult result = |
writer_->WritePacket(buffer, buf_len, self_address, peer_address, writer); |
if (result.status == WRITE_STATUS_BLOCKED) { |
+ DCHECK(IsWriteBlocked()); |
write_blocked_list_.insert(make_pair(writer, true)); |
- write_blocked_ = true; |
} |
return result; |
} |
@@ -174,6 +175,14 @@ bool QuicDispatcher::IsWriteBlockedDataBuffered() const { |
return writer_->IsWriteBlockedDataBuffered(); |
} |
+bool QuicDispatcher::IsWriteBlocked() const { |
+ return writer_->IsWriteBlocked(); |
+} |
+ |
+void QuicDispatcher::SetWritable() { |
+ writer_->SetWritable(); |
+} |
+ |
void QuicDispatcher::ProcessPacket(const IPEndPoint& server_address, |
const IPEndPoint& client_address, |
const QuicEncryptedPacket& packet) { |
@@ -263,13 +272,9 @@ void QuicDispatcher::DeleteSessions() { |
STLDeleteElements(&closed_session_list_); |
} |
-void QuicDispatcher::UseWriter(QuicPacketWriter* writer) { |
- writer_.reset(writer); |
-} |
- |
bool QuicDispatcher::OnCanWrite() { |
// We got an EPOLLOUT: the socket should not be blocked. |
- write_blocked_ = false; |
+ SetWritable(); |
// Give each writer one attempt to write. |
int num_writers = write_blocked_list_.size(); |
@@ -280,7 +285,7 @@ bool QuicDispatcher::OnCanWrite() { |
QuicBlockedWriterInterface* writer = write_blocked_list_.begin()->first; |
write_blocked_list_.erase(write_blocked_list_.begin()); |
bool can_write_more = writer->OnCanWrite(); |
- if (write_blocked_) { |
+ if (IsWriteBlocked()) { |
// We were unable to write. Wait for the next EPOLLOUT. |
// In this case, the session would have been added to the blocked list |
// up in WritePacket. |