| Index: net/tools/quic/quic_dispatcher.h
|
| diff --git a/net/tools/quic/quic_dispatcher.h b/net/tools/quic/quic_dispatcher.h
|
| index 8d7b03b1e14b22c9f99a490057d82daa05547d55..2bc489d43c32317b266d9fa8af04177ee0fc3d64 100644
|
| --- a/net/tools/quic/quic_dispatcher.h
|
| +++ b/net/tools/quic/quic_dispatcher.h
|
| @@ -20,7 +20,8 @@
|
| #include "net/tools/quic/quic_server_session.h"
|
| #include "net/tools/quic/quic_time_wait_list_manager.h"
|
|
|
| -#if defined(COMPILER_GCC)
|
| +#if defined(COMPILER_GCC) && !defined(QUIC_BLOCKED_WRITER_INTERFACE_HASH)
|
| +#define QUIC_BLOCKED_WRITER_INTERFACE_HASH
|
| namespace BASE_HASH_NAMESPACE {
|
| template<>
|
| struct hash<net::QuicBlockedWriterInterface*> {
|
| @@ -61,15 +62,40 @@ class ProcessPacketInterface {
|
| class QuicDispatcher : public QuicServerSessionVisitor,
|
| public ProcessPacketInterface {
|
| public:
|
| + // Creates per-connection packet writers out of the QuicDispatcher's shared
|
| + // QuicPacketWriter. The per-connection writers' IsWriteBlocked() state must
|
| + // always be the same as the shared writer's IsWriteBlocked(), or else the
|
| + // QuicDispatcher::OnCanWrite logic will not work. (This will hopefully be
|
| + // cleaned up for bug 16950226.)
|
| + class PacketWriterFactory {
|
| + public:
|
| + virtual ~PacketWriterFactory() {}
|
| +
|
| + virtual QuicPacketWriter* Create(QuicPacketWriter* writer,
|
| + QuicConnection* connection) = 0;
|
| + };
|
| +
|
| + // Creates ordinary QuicPerConnectionPacketWriter instances.
|
| + class DefaultPacketWriterFactory : public PacketWriterFactory {
|
| + public:
|
| + virtual ~DefaultPacketWriterFactory() {}
|
| +
|
| + virtual QuicPacketWriter* Create(
|
| + QuicPacketWriter* writer,
|
| + QuicConnection* connection) OVERRIDE;
|
| + };
|
| +
|
| // Ideally we'd have a linked_hash_set: the boolean is unused.
|
| typedef linked_hash_map<QuicBlockedWriterInterface*, bool> WriteBlockedList;
|
|
|
| - // Due to the way delete_sessions_closure_ is registered, the Dispatcher
|
| - // must live until epoll_server Shutdown. |supported_versions| specifies the
|
| - // list of supported QUIC versions.
|
| + // Due to the way delete_sessions_closure_ is registered, the Dispatcher must
|
| + // live until epoll_server Shutdown. |supported_versions| specifies the list
|
| + // of supported QUIC versions. Takes ownership of |packet_writer_factory|,
|
| + // which is used to create per-connection writers.
|
| QuicDispatcher(const QuicConfig& config,
|
| const QuicCryptoServerConfig& crypto_config,
|
| const QuicVersionVector& supported_versions,
|
| + PacketWriterFactory* packet_writer_factory,
|
| EpollServer* epoll_server);
|
|
|
| virtual ~QuicDispatcher();
|
| @@ -164,10 +190,29 @@ class QuicDispatcher : public QuicServerSessionVisitor,
|
|
|
| QuicPacketWriter* writer() { return writer_.get(); }
|
|
|
| + const QuicConnection::PacketWriterFactory& connection_writer_factory() {
|
| + return connection_writer_factory_;
|
| + }
|
| +
|
| private:
|
| class QuicFramerVisitor;
|
| friend class net::tools::test::QuicDispatcherPeer;
|
|
|
| + // An adapter that creates packet writers using the dispatcher's
|
| + // PacketWriterFactory and shared writer. Essentially, it just curries the
|
| + // writer argument away from QuicDispatcher::PacketWriterFactory.
|
| + class PacketWriterFactoryAdapter :
|
| + public QuicConnection::PacketWriterFactory {
|
| + public:
|
| + PacketWriterFactoryAdapter(QuicDispatcher* dispatcher);
|
| + virtual ~PacketWriterFactoryAdapter ();
|
| +
|
| + virtual QuicPacketWriter* Create(QuicConnection* connection) const OVERRIDE;
|
| +
|
| + private:
|
| + QuicDispatcher* dispatcher_;
|
| + };
|
| +
|
| // Called by |framer_visitor_| when the private header has been parsed
|
| // of a data packet that is destined for the time wait manager.
|
| void OnUnauthenticatedHeader(const QuicPacketHeader& header);
|
| @@ -204,6 +249,12 @@ class QuicDispatcher : public QuicServerSessionVisitor,
|
| // The writer to write to the socket with.
|
| scoped_ptr<QuicPacketWriter> writer_;
|
|
|
| + // Used to create per-connection packet writers, not |writer_| itself.
|
| + scoped_ptr<PacketWriterFactory> packet_writer_factory_;
|
| +
|
| + // Passed in to QuicConnection for it to create the per-connection writers
|
| + PacketWriterFactoryAdapter connection_writer_factory_;
|
| +
|
| // This vector contains QUIC versions which we currently support.
|
| // This should be ordered such that the highest supported version is the first
|
| // element, with subsequent elements in descending order (versions can be
|
|
|