Chromium Code Reviews| Index: net/spdy/spdy_write_queue.h |
| diff --git a/net/spdy/spdy_write_queue.h b/net/spdy/spdy_write_queue.h |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..637369b18b140c5ec94e08fc3bbb58cb50cc9d56 |
| --- /dev/null |
| +++ b/net/spdy/spdy_write_queue.h |
| @@ -0,0 +1,102 @@ |
| +// Copyright (c) 2013 The Chromium Authors. All rights reserved. |
| +// Use of this source code is governed by a BSD-style license that can be |
| +// found in the LICENSE file. |
| + |
| +#ifndef NET_SPDY_SPDY_WRITE_QUEUE_H_ |
| +#define NET_SPDY_SPDY_WRITE_QUEUE_H_ |
| + |
| +#include <deque> |
| + |
| +#include "base/basictypes.h" |
| +#include "base/compiler_specific.h" |
| +#include "base/memory/ref_counted.h" |
| +#include "base/memory/scoped_ptr.h" |
| +#include "net/base/net_export.h" |
| +#include "net/base/request_priority.h" |
| + |
| +namespace net { |
| + |
| +class SpdyFrame; |
| +class SpdyStream; |
| + |
| +// An object which provides a SpdyFrame for writing. We pass these |
| +// around instead of SpdyFrames since some frames have to be generated |
| +// "just in time". |
| +class NET_EXPORT_PRIVATE SpdyFrameProducer { |
| + public: |
| + SpdyFrameProducer(); |
| + |
| + // Produces the frame to be written. Will be called at most once. |
| + virtual scoped_ptr<SpdyFrame> ProduceFrame() = 0; |
| + |
| + virtual ~SpdyFrameProducer(); |
| + |
| + private: |
| + DISALLOW_COPY_AND_ASSIGN(SpdyFrameProducer); |
| +}; |
| + |
| +// A simple wrapper around a single SpdyFrame. |
| +class NET_EXPORT_PRIVATE SimpleFrameProducer : public SpdyFrameProducer { |
| + public: |
| + explicit SimpleFrameProducer(scoped_ptr<SpdyFrame> frame); |
| + |
| + virtual ~SimpleFrameProducer(); |
| + |
| + virtual scoped_ptr<SpdyFrame> ProduceFrame() OVERRIDE; |
| + |
| + private: |
| + scoped_ptr<SpdyFrame> frame_; |
| + |
| + DISALLOW_COPY_AND_ASSIGN(SimpleFrameProducer); |
| +}; |
| + |
| +// A queue of SpdyFrameProducers to produce frames to write. Ordered |
| +// by priority, and then FIFO. |
| +class NET_EXPORT_PRIVATE SpdyWriteQueue { |
|
Ryan Hamilton
2013/03/28 15:51:04
Since this WriteQueue is only used by the Session,
akalin
2013/04/06 01:17:48
Done.
|
| + public: |
| + SpdyWriteQueue(); |
| + ~SpdyWriteQueue(); |
| + |
| + // Enqueues the given frame producer at the given priority |
| + // associated with the given stream, which may be NULL if the frame |
| + // producer is associated with the session. |
|
Ryan Hamilton
2013/03/28 15:51:04
nit: if the frame is *not* associated with *a stre
akalin
2013/04/06 01:17:48
Done.
|
| + void Enqueue(RequestPriority priority, |
| + scoped_ptr<SpdyFrameProducer> frame_producer, |
| + const scoped_refptr<SpdyStream>& stream); |
|
Ryan Hamilton
2013/03/28 15:51:04
out of curiosity, why is this a const scoped_refpt
akalin
2013/04/06 01:17:48
it saves a ref inc/dec. habit I picked up from wil
|
| + |
| + // Dequeues the next frame producer and its associated |
|
Ryan Hamilton
2013/03/28 15:51:04
nit: Can you comment on the ordering guarantees of
akalin
2013/04/06 01:17:48
Done.
|
| + // stream. Returns true and fills in |frame_producer| and |stream| |
| + // if successful -- otherwise, just returns false. |
| + bool Dequeue(scoped_ptr<SpdyFrameProducer>* frame_producer, |
| + scoped_refptr<SpdyStream>* stream); |
| + |
| + // Removes all pending writes for the given stream, which must be |
| + // non-NULL. |
| + void RemovePendingWritesForStream(const scoped_refptr<SpdyStream>& stream); |
| + |
| + // Removes all pending writes. |
| + void Clear(); |
| + |
| + private: |
| + // A struct holding a frame producer and its associated stream. |
| + struct PendingWrite { |
| + // This has to be a raw pointer since we store this in an STL |
| + // container. |
| + SpdyFrameProducer* frame_producer; |
| + scoped_refptr<SpdyStream> stream; |
| + |
| + PendingWrite(); |
| + PendingWrite(SpdyFrameProducer* frame_producer, |
| + const scoped_refptr<SpdyStream>& stream); |
| + ~PendingWrite(); |
| + }; |
| + |
| + // The actual write queue, binned by priority. |
| + std::deque<PendingWrite> queue_[NUM_PRIORITIES]; |
| + |
| + DISALLOW_COPY_AND_ASSIGN(SpdyWriteQueue); |
| +}; |
| + |
| +} // namespace |
| + |
| +#endif // NET_SPDY_SPDY_WRITE_QUEUE_H_ |