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