1c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved.
2c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// found in the LICENSE file.
4c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
5c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#ifndef NET_SPDY_SPDY_WRITE_QUEUE_H_
6c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#define NET_SPDY_SPDY_WRITE_QUEUE_H_
7c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
8c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include <deque>
9c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
10c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/basictypes.h"
11c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/memory/scoped_ptr.h"
12a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)#include "base/memory/weak_ptr.h"
13c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "net/base/net_export.h"
14c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "net/base/request_priority.h"
15c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "net/spdy/spdy_protocol.h"
16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace net {
18c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
19c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class SpdyBuffer;
20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class SpdyBufferProducer;
21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class SpdyStream;
22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// A queue of SpdyBufferProducers to produce frames to write. Ordered
24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// by priority, and then FIFO.
25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class NET_EXPORT_PRIVATE SpdyWriteQueue {
26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  SpdyWriteQueue();
28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ~SpdyWriteQueue();
29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
30ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // Returns whether there is anything in the write queue,
31ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // i.e. whether the next call to Dequeue will return true.
32ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  bool IsEmpty() const;
33ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Enqueues the given frame producer of the given type at the given
35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // priority associated with the given stream, which may be NULL if
36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // the frame producer is not associated with a stream. If |stream|
37a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  // is non-NULL, its priority must be equal to |priority|, and it
38a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  // must remain non-NULL until the write is dequeued or removed.
39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void Enqueue(RequestPriority priority,
40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)               SpdyFrameType frame_type,
41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)               scoped_ptr<SpdyBufferProducer> frame_producer,
42a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)               const base::WeakPtr<SpdyStream>& stream);
43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Dequeues the frame producer with the highest priority that was
45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // enqueued the earliest and its associated stream. Returns true and
46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // fills in |frame_type|, |frame_producer|, and |stream| if
47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // successful -- otherwise, just returns false.
48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool Dequeue(SpdyFrameType* frame_type,
49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)               scoped_ptr<SpdyBufferProducer>* frame_producer,
50a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)               base::WeakPtr<SpdyStream>* stream);
51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Removes all pending writes for the given stream, which must be
53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // non-NULL.
54a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  void RemovePendingWritesForStream(const base::WeakPtr<SpdyStream>& stream);
55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Removes all pending writes for streams after |last_good_stream_id|
57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // and streams with no stream id.
58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void RemovePendingWritesForStreamsAfter(SpdyStreamId last_good_stream_id);
59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Removes all pending writes.
61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void Clear();
62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // A struct holding a frame producer and its associated stream.
65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  struct PendingWrite {
66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    SpdyFrameType frame_type;
67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // This has to be a raw pointer since we store this in an STL
68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // container.
69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    SpdyBufferProducer* frame_producer;
70a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    base::WeakPtr<SpdyStream> stream;
71a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    // Whether |stream| was non-NULL when enqueued.
72a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    bool has_stream;
73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    PendingWrite();
75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    PendingWrite(SpdyFrameType frame_type,
76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                 SpdyBufferProducer* frame_producer,
77a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)                 const base::WeakPtr<SpdyStream>& stream);
78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ~PendingWrite();
79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  };
80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
81010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  bool removing_writes_;
82010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // The actual write queue, binned by priority.
84c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  std::deque<PendingWrite> queue_[NUM_PRIORITIES];
85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(SpdyWriteQueue);
87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}  // namespace net
90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif  // NET_SPDY_SPDY_WRITE_QUEUE_H_
92