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