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

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

Issue 974483002: [WebView] Remove onFailure from VisualStateCallback. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 9 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
1 // Copyright 2014 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "content/renderer/gpu/frame_swap_message_queue.h" 5 #include "content/renderer/gpu/frame_swap_message_queue.h"
6 6
7 #include <limits> 7 #include <limits>
8 8
9 #include "base/containers/hash_tables.h" 9 #include "base/containers/hash_tables.h"
10 #include "base/logging.h" 10 #include "base/logging.h"
11 #include "base/stl_util.h" 11 #include "base/stl_util.h"
12 #include "content/common/frame_messages.h"
12 #include "ipc/ipc_message.h" 13 #include "ipc/ipc_message.h"
13 14
14 using std::vector; 15 using std::vector;
15 16
16 namespace content { 17 namespace content {
17 18
18 class FrameSwapMessageSubQueue { 19 class FrameSwapMessageSubQueue {
19 public: 20 public:
20 FrameSwapMessageSubQueue() {} 21 FrameSwapMessageSubQueue() {}
21 virtual ~FrameSwapMessageSubQueue() {} 22 virtual ~FrameSwapMessageSubQueue() {}
22 virtual bool Empty() const = 0; 23 virtual bool Empty() const = 0;
23 virtual void QueueMessage(int source_frame_number, 24 virtual void QueueMessage(int source_frame_number,
24 scoped_ptr<IPC::Message> msg, 25 scoped_ptr<IPC::Message> msg,
25 bool* is_first) = 0; 26 bool* is_first) = 0;
26 virtual void DrainMessages(int source_frame_number, 27 virtual void OnDrainMessages(ScopedVector<IPC::Message>* messages) = 0;
27 ScopedVector<IPC::Message>* messages) = 0; 28 virtual void OnDidSwap(int source_frame_number,
29 ScopedVector<IPC::Message>* messages) = 0;
30 virtual void OnDidNotSwap(int source_frame_number,
31 cc::SwapPromise::DidNotSwapReason reason,
32 ScopedVector<IPC::Message>* messages) = 0;
28 33
29 private: 34 private:
30 DISALLOW_COPY_AND_ASSIGN(FrameSwapMessageSubQueue); 35 DISALLOW_COPY_AND_ASSIGN(FrameSwapMessageSubQueue);
31 }; 36 };
32 37
33 namespace { 38 namespace {
34 39
35 // Queue specific to MESSAGE_DELIVERY_POLICY_WITH_VISUAL_STATE. 40 // Queue specific to MESSAGE_DELIVERY_POLICY_WITH_VISUAL_STATE.
36 class SendMessageScopeImpl : public FrameSwapMessageQueue::SendMessageScope { 41 class SendMessageScopeImpl : public FrameSwapMessageQueue::SendMessageScope {
37 public: 42 public:
(...skipping 19 matching lines...) Expand all
57 62
58 void QueueMessage(int source_frame_number, 63 void QueueMessage(int source_frame_number,
59 scoped_ptr<IPC::Message> msg, 64 scoped_ptr<IPC::Message> msg,
60 bool* is_first) override { 65 bool* is_first) override {
61 if (is_first) 66 if (is_first)
62 *is_first = (queue_.count(source_frame_number) == 0); 67 *is_first = (queue_.count(source_frame_number) == 0);
63 68
64 queue_[source_frame_number].push_back(msg.release()); 69 queue_[source_frame_number].push_back(msg.release());
65 } 70 }
66 71
67 void DrainMessages(int source_frame_number, 72 void DeliverSwapInfo(const std::set<int32>& routing_ids,
68 ScopedVector<IPC::Message>* messages) override { 73 int source_frame_number,
74 bool swap_success,
75 ScopedVector<IPC::Message>* messages) {
76 for (auto& routing_id : routing_ids) {
77 messages->push_back(new FrameHostMsg_VisualStateSwapInfo(
78 routing_id, source_frame_number, swap_success));
79 }
80 }
81
82 std::set<int32> GetRoutingIDs(int source_frame_number) {
83 std::set<int32> routing_ids;
69 VisualStateQueueMap::iterator end = queue_.upper_bound(source_frame_number); 84 VisualStateQueueMap::iterator end = queue_.upper_bound(source_frame_number);
70 for (VisualStateQueueMap::iterator i = queue_.begin(); i != end; i++) { 85 for (VisualStateQueueMap::iterator i = queue_.begin(); i != end; i++) {
71 DCHECK(i->first <= source_frame_number); 86 DCHECK(i->first <= source_frame_number);
87 for (auto& msg : i->second) {
88 routing_ids.insert(msg->routing_id());
89 }
90 }
91 return routing_ids;
92 }
93
94 void OnDidSwap(int source_frame_number,
95 ScopedVector<IPC::Message>* messages) override {
96 DeliverSwapInfo(GetRoutingIDs(source_frame_number), source_frame_number,
97 true, messages);
98 DrainMessages(source_frame_number, messages);
99 }
100
101 void OnDidNotSwap(int source_frame_number,
102 cc::SwapPromise::DidNotSwapReason reason,
103 ScopedVector<IPC::Message>* messages) override {
104 bool swap_ok;
105 switch (reason) {
106 case cc::SwapPromise::SWAP_FAILS:
107 case cc::SwapPromise::COMMIT_NO_UPDATE:
108 swap_ok = true;
109 break;
110 case cc::SwapPromise::COMMIT_FAILS:
111 swap_ok = false;
112 break;
113 default:
114 swap_ok = false;
115 NOTREACHED();
116 }
117 DeliverSwapInfo(GetRoutingIDs(source_frame_number), source_frame_number,
118 swap_ok, messages);
119 DrainMessages(source_frame_number, messages);
120 }
121
122 void OnDrainMessages(ScopedVector<IPC::Message>* messages) override {}
123
124 private:
125 void DrainMessages(int source_frame_number,
126 ScopedVector<IPC::Message>* messages) {
127 VisualStateQueueMap::iterator end = queue_.upper_bound(source_frame_number);
128 for (VisualStateQueueMap::iterator i = queue_.begin(); i != end; i++) {
129 DCHECK(i->first <= source_frame_number);
72 messages->insert(messages->end(), i->second.begin(), i->second.end()); 130 messages->insert(messages->end(), i->second.begin(), i->second.end());
73 i->second.clear(); 131 i->second.clear();
74 } 132 }
75 queue_.erase(queue_.begin(), end); 133 queue_.erase(queue_.begin(), end);
76 } 134 }
77 135
78 private: 136 typedef std::map<int, std::vector<IPC::Message*>> VisualStateQueueMap;
79 typedef std::map<int, std::vector<IPC::Message*> > VisualStateQueueMap;
80 VisualStateQueueMap queue_; 137 VisualStateQueueMap queue_;
81 138
82 DISALLOW_COPY_AND_ASSIGN(VisualStateQueue); 139 DISALLOW_COPY_AND_ASSIGN(VisualStateQueue);
83 }; 140 };
84 141
85 // Queue specific to MESSAGE_DELIVERY_POLICY_WITH_NEXT_SWAP. 142 // Queue specific to MESSAGE_DELIVERY_POLICY_WITH_NEXT_SWAP.
86 class SwapQueue : public FrameSwapMessageSubQueue { 143 class SwapQueue : public FrameSwapMessageSubQueue {
87 public: 144 public:
88 SwapQueue() {} 145 SwapQueue() {}
89 bool Empty() const override { return queue_.empty(); } 146 bool Empty() const override { return queue_.empty(); }
90 147
91 void QueueMessage(int source_frame_number, 148 void QueueMessage(int source_frame_number,
92 scoped_ptr<IPC::Message> msg, 149 scoped_ptr<IPC::Message> msg,
93 bool* is_first) override { 150 bool* is_first) override {
94 if (is_first) 151 if (is_first)
95 *is_first = Empty(); 152 *is_first = Empty();
96 queue_.push_back(msg.release()); 153 queue_.push_back(msg.release());
97 } 154 }
98 155
156 void OnDrainMessages(ScopedVector<IPC::Message>* messages) override {
157 DrainMessages(0, messages);
158 }
159
160 virtual void OnDidSwap(int source_frame_number,
161 ScopedVector<IPC::Message>* messages) {
162 }
163
164 virtual void OnDidNotSwap(int source_frame_number,
165 cc::SwapPromise::DidNotSwapReason reason,
166 ScopedVector<IPC::Message>* messages) {
167 switch (reason) {
168 case cc::SwapPromise::SWAP_FAILS:
169 case cc::SwapPromise::COMMIT_NO_UPDATE:
170 DrainMessages(source_frame_number, messages);
171 break;
172 case cc::SwapPromise::COMMIT_FAILS:
173 break;
174 default:
175 NOTREACHED();
176 }
177 }
178
179 private:
99 void DrainMessages(int source_frame_number, 180 void DrainMessages(int source_frame_number,
100 ScopedVector<IPC::Message>* messages) override { 181 ScopedVector<IPC::Message>* messages) {
101 messages->insert(messages->end(), queue_.begin(), queue_.end()); 182 messages->insert(messages->end(), queue_.begin(), queue_.end());
102 queue_.weak_clear(); 183 queue_.weak_clear();
103 } 184 }
104 185
105 private:
106 ScopedVector<IPC::Message> queue_; 186 ScopedVector<IPC::Message> queue_;
107 187
108 DISALLOW_COPY_AND_ASSIGN(SwapQueue); 188 DISALLOW_COPY_AND_ASSIGN(SwapQueue);
109 }; 189 };
110 190
111 } // namespace 191 } // namespace
112 192
113 FrameSwapMessageQueue::FrameSwapMessageQueue() 193 FrameSwapMessageQueue::FrameSwapMessageQueue()
114 : visual_state_queue_(new VisualStateQueue()), 194 : visual_state_queue_(new VisualStateQueue()),
115 swap_queue_(new SwapQueue()) { 195 swap_queue_(new SwapQueue()) {
(...skipping 25 matching lines...) Expand all
141 void FrameSwapMessageQueue::QueueMessageForFrame(MessageDeliveryPolicy policy, 221 void FrameSwapMessageQueue::QueueMessageForFrame(MessageDeliveryPolicy policy,
142 int source_frame_number, 222 int source_frame_number,
143 scoped_ptr<IPC::Message> msg, 223 scoped_ptr<IPC::Message> msg,
144 bool* is_first) { 224 bool* is_first) {
145 base::AutoLock lock(lock_); 225 base::AutoLock lock(lock_);
146 GetSubQueue(policy)->QueueMessage(source_frame_number, msg.Pass(), is_first); 226 GetSubQueue(policy)->QueueMessage(source_frame_number, msg.Pass(), is_first);
147 } 227 }
148 228
149 void FrameSwapMessageQueue::DidSwap(int source_frame_number) { 229 void FrameSwapMessageQueue::DidSwap(int source_frame_number) {
150 base::AutoLock lock(lock_); 230 base::AutoLock lock(lock_);
151 231 swap_queue_->OnDidSwap(source_frame_number, &next_drain_messages_);
152 visual_state_queue_->DrainMessages(source_frame_number, 232 visual_state_queue_->OnDidSwap(source_frame_number, &next_drain_messages_);
153 &next_drain_messages_);
154 } 233 }
155 234
156 void FrameSwapMessageQueue::DidNotSwap(int source_frame_number, 235 void FrameSwapMessageQueue::DidNotSwap(int source_frame_number,
157 cc::SwapPromise::DidNotSwapReason reason, 236 cc::SwapPromise::DidNotSwapReason reason,
158 ScopedVector<IPC::Message>* messages) { 237 ScopedVector<IPC::Message>* messages) {
159 base::AutoLock lock(lock_); 238 base::AutoLock lock(lock_);
160 switch (reason) { 239 swap_queue_->OnDidNotSwap(source_frame_number, reason, messages);
161 case cc::SwapPromise::SWAP_FAILS: 240 visual_state_queue_->OnDidNotSwap(source_frame_number, reason, messages);
162 case cc::SwapPromise::COMMIT_NO_UPDATE:
163 swap_queue_->DrainMessages(source_frame_number, messages);
164 // fallthrough
165 case cc::SwapPromise::COMMIT_FAILS:
166 visual_state_queue_->DrainMessages(source_frame_number, messages);
167 break;
168 default:
169 NOTREACHED();
170 }
171 } 241 }
172 242
173 void FrameSwapMessageQueue::DrainMessages( 243 void FrameSwapMessageQueue::DrainMessages(
174 ScopedVector<IPC::Message>* messages) { 244 ScopedVector<IPC::Message>* messages) {
175 lock_.AssertAcquired(); 245 lock_.AssertAcquired();
176 246
177 swap_queue_->DrainMessages(0, messages); 247 swap_queue_->OnDrainMessages(messages);
178 messages->insert(messages->end(), 248 visual_state_queue_->OnDrainMessages(messages);
179 next_drain_messages_.begin(), 249 messages->insert(messages->end(), next_drain_messages_.begin(),
180 next_drain_messages_.end()); 250 next_drain_messages_.end());
181 next_drain_messages_.weak_clear(); 251 next_drain_messages_.weak_clear();
182 } 252 }
183 253
184 scoped_ptr<FrameSwapMessageQueue::SendMessageScope> 254 scoped_ptr<FrameSwapMessageQueue::SendMessageScope>
185 FrameSwapMessageQueue::AcquireSendMessageScope() { 255 FrameSwapMessageQueue::AcquireSendMessageScope() {
186 return make_scoped_ptr(new SendMessageScopeImpl(&lock_)); 256 return make_scoped_ptr(new SendMessageScopeImpl(&lock_));
187 } 257 }
188 258
189 // static 259 // static
190 void FrameSwapMessageQueue::TransferMessages(ScopedVector<IPC::Message>& source, 260 void FrameSwapMessageQueue::TransferMessages(ScopedVector<IPC::Message>& source,
191 vector<IPC::Message>* dest) { 261 vector<IPC::Message>* dest) {
192 for (vector<IPC::Message*>::iterator i = source.begin(); i != source.end(); 262 for (vector<IPC::Message*>::iterator i = source.begin(); i != source.end();
193 ++i) { 263 ++i) {
194 IPC::Message* m(*i); 264 IPC::Message* m(*i);
195 dest->push_back(*m); 265 dest->push_back(*m);
196 delete m; 266 delete m;
197 } 267 }
198 source.weak_clear(); 268 source.weak_clear();
199 } 269 }
200 270
201 } // namespace content 271 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698