Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(365)

Side by Side Diff: content/renderer/gpu/frame_update_message_queue.cc

Issue 1126963006: Move VISUAL_STATE promise to activation (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Current state (presubmit warnings, cc_unittests tests failing) Created 5 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "content/renderer/gpu/frame_update_message_queue.h"
6
7 #include <limits>
8
9 #include "base/containers/hash_tables.h"
10 #include "base/logging.h"
11 #include "base/stl_util.h"
12 #include "ipc/ipc_message.h"
13
14 using std::vector;
15
16 namespace content {
17
18 namespace {
19
20 // Queue specific to MESSAGE_DELIVERY_POLICY_WITH_VISUAL_STATE.
21 class SendMessageScopeImpl : public FrameUpdateMessageQueue::SendMessageScope {
22 public:
23 SendMessageScopeImpl(base::Lock* lock) : auto_lock_(*lock) {}
24 ~SendMessageScopeImpl() override {}
25
26 private:
27 base::AutoLock auto_lock_;
28 };
29
30 } // namespace
31
32 class FrameUpdateMessageSubQueue {
33 typedef std::vector<IPC::Message*> MessageQueue;
34 typedef std::map<int, MessageQueue> FrameNumberQueueMap;
35
36 public:
37 FrameUpdateMessageSubQueue() {}
38
39 ~FrameUpdateMessageSubQueue() {
40 for (FrameNumberQueueMap::iterator i = queue_.begin(); i != queue_.end();
41 i++) {
42 STLDeleteElements(&i->second);
43 }
44 }
45
46 bool Empty() const {
47 return std::find_if(queue_.begin(), queue_.end(),
48 [](const FrameNumberQueueMap::value_type& val) -> bool {
49 return val.second.size() > 0;
50 }) == queue_.end();
51 }
52
53 void QueueMessage(int source_frame_number,
54 scoped_ptr<IPC::Message> msg,
55 bool* is_first) {
56 auto &frame_queue = queue_[source_frame_number];
57 if (is_first)
58 *is_first = frame_queue.size() == 0;
59
60 frame_queue.push_back(msg.release());
61 }
62
63 MessageQueue &GetFrameQueue(int source_frame_number) {
64 return queue_[source_frame_number];
65 }
66
67 template <typename out_iter>
68 void DrainMessages(int source_frame_number, out_iter out) {
69 FrameNumberQueueMap::iterator end = queue_.upper_bound(source_frame_number);
70 for (FrameNumberQueueMap::iterator i = queue_.begin(); i != end; i++) {
71 DCHECK(i->first <= source_frame_number);
72 std::copy(i->second.begin(), i->second.end(), out);
73 i->second.clear();
74 }
75 queue_.erase(queue_.begin(), end);
76 }
77
78 void DrainMessages(int source_frame_number,
79 ScopedVector<IPC::Message>* messages) {
80 DrainMessages(source_frame_number, std::back_inserter(*messages));
81 }
82
83 private:
84 FrameNumberQueueMap queue_;
85
86 DISALLOW_COPY_AND_ASSIGN(FrameUpdateMessageSubQueue);
87 };
88
89 FrameUpdateMessageQueue::FrameUpdateMessageQueue()
90 : visual_state_queue_(new FrameUpdateMessageSubQueue()),
91 swap_queue_(new FrameUpdateMessageSubQueue()),
92 activation_queue_(new FrameUpdateMessageSubQueue()) {
93 }
94
95 FrameUpdateMessageQueue::~FrameUpdateMessageQueue() {
96 }
97
98 bool FrameUpdateMessageQueue::Empty() const {
99 base::AutoLock lock(lock_);
100 return visual_state_queue_->Empty() && swap_queue_->Empty() &&
101 activation_queue_->Empty();
102 }
103
104 FrameUpdateMessageSubQueue* FrameUpdateMessageQueue::GetSubQueue(
105 MessageDeliveryPolicy policy) {
106 switch (policy) {
107 case MESSAGE_DELIVERY_POLICY_WITH_NEXT_SWAP:
108 return swap_queue_.get();
109 break;
110 case MESSAGE_DELIVERY_POLICY_WITH_VISUAL_STATE:
111 return visual_state_queue_.get();
112 break;
113 case MESSAGE_DELIVERY_POLICY_WITH_ACTIVATION:
114 return activation_queue_.get();
115 break;
116 }
117 NOTREACHED();
118 return NULL;
119 }
120
121 void FrameUpdateMessageQueue::QueueMessageForFrame(MessageDeliveryPolicy policy,
122 int source_frame_number,
123 scoped_ptr<IPC::Message> msg,
124 bool* is_first) {
125 base::AutoLock lock(lock_);
126 if (is_first) *is_first = false;
127 switch (policy) {
128 case MESSAGE_DELIVERY_POLICY_WITH_NEXT_SWAP:
129 swap_queue_->QueueMessage(0, msg.Pass(), is_first);
130 return;
131 case MESSAGE_DELIVERY_POLICY_WITH_VISUAL_STATE:
132 visual_state_queue_->QueueMessage(source_frame_number, msg.Pass(), is_firs t);
133 return;
134 case MESSAGE_DELIVERY_POLICY_WITH_ACTIVATION:
135 activation_queue_->QueueMessage(source_frame_number, msg.Pass(), is_first) ;
136 return;
137 }
138 NOTREACHED();
139 }
140
141 void FrameUpdateMessageQueue::DidSwap(int source_frame_number) {
142 base::AutoLock lock(lock_);
143
144 visual_state_queue_->DrainMessages(
145 source_frame_number, std::back_inserter(swap_queue_->GetFrameQueue(0)));
146 }
147
148 void FrameUpdateMessageQueue::DidNotSwap(int source_frame_number,
149 cc::Promise::DidNotSwap::Reason reason,
150 ScopedVector<IPC::Message>* messages) {
151 base::AutoLock lock(lock_);
152 switch (reason) {
153 case cc::Promise::DidNotSwap::SWAP_FAILS:
154 case cc::Promise::DidNotSwap::COMMIT_NO_UPDATE:
155 swap_queue_->DrainMessages(0, messages);
156 visual_state_queue_->DrainMessages(source_frame_number, messages);
157 break;
158 case cc::Promise::DidNotSwap::COMMIT_FAILS:
159 // Do not queue any responses here.
160 // If COMMIT_FAILS the renderer is shutting down, which will
161 // result in the RenderFrameHostImpl destructor firing the
162 // remaining response callbacks itself.
163 break;
164 default:
165 NOTREACHED();
166 }
167 }
168
169 void FrameUpdateMessageQueue::DidActivate(
170 int source_frame_number,
171 ScopedVector<IPC::Message>* messages) {
172 base::AutoLock lock(lock_);
173 activation_queue_->DrainMessages(source_frame_number, messages);
174 }
175
176 void FrameUpdateMessageQueue::DidNotActivate(
177 int source_frame_number,
178 cc::Promise::DidNotActivate::Reason reason,
179 ScopedVector<IPC::Message>* messages) {
180 base::AutoLock lock(lock_);
181 switch (reason) {
182 case cc::Promise::DidNotActivate::ACTIVATION_FAILS:
183 case cc::Promise::DidNotActivate::COMMIT_NO_UPDATE:
184 activation_queue_->DrainMessages(source_frame_number, messages);
185 break;
186 case cc::Promise::DidNotActivate::COMMIT_FAILS:
187 // Do not queue any responses here.
188 // If COMMIT_FAILS the renderer is shutting down, which will
189 // result in the RenderFrameHostImpl destructor firing the
190 // remaining response callbacks itself.
191 break;
192 default:
193 NOTREACHED();
194 }
195 }
196
197 void FrameUpdateMessageQueue::DrainMessagesForSwap(
198 ScopedVector<IPC::Message>* messages) {
199 lock_.AssertAcquired();
200
201 swap_queue_->DrainMessages(0, messages);
202 }
203
204 scoped_ptr<FrameUpdateMessageQueue::SendMessageScope>
205 FrameUpdateMessageQueue::AcquireSendMessageScope() {
206 return make_scoped_ptr(new SendMessageScopeImpl(&lock_));
207 }
208
209 // static
210 void FrameUpdateMessageQueue::TransferMessages(ScopedVector<IPC::Message>& sourc e,
211 vector<IPC::Message>* dest) {
212 for (vector<IPC::Message*>::iterator i = source.begin(); i != source.end();
213 ++i) {
214 IPC::Message* m(*i);
215 dest->push_back(*m);
216 delete m;
217 }
218 source.weak_clear();
219 }
220
221 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698