OLD | NEW |
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 <algorithm> | 7 #include <algorithm> |
8 #include <limits> | 8 #include <limits> |
9 #include <utility> | 9 #include <utility> |
10 | 10 |
11 #include "base/containers/hash_tables.h" | 11 #include "base/containers/hash_tables.h" |
12 #include "base/logging.h" | 12 #include "base/logging.h" |
13 #include "base/macros.h" | 13 #include "base/macros.h" |
| 14 #include "base/memory/ptr_util.h" |
14 #include "base/stl_util.h" | 15 #include "base/stl_util.h" |
15 #include "ipc/ipc_message.h" | 16 #include "ipc/ipc_message.h" |
16 | 17 |
17 using std::vector; | 18 using std::vector; |
18 | 19 |
19 namespace content { | 20 namespace content { |
20 | 21 |
21 class FrameSwapMessageSubQueue { | 22 class FrameSwapMessageSubQueue { |
22 public: | 23 public: |
23 FrameSwapMessageSubQueue() {} | 24 FrameSwapMessageSubQueue() {} |
24 virtual ~FrameSwapMessageSubQueue() {} | 25 virtual ~FrameSwapMessageSubQueue() {} |
25 virtual bool Empty() const = 0; | 26 virtual bool Empty() const = 0; |
26 virtual void QueueMessage(int source_frame_number, | 27 virtual void QueueMessage(int source_frame_number, |
27 scoped_ptr<IPC::Message> msg, | 28 std::unique_ptr<IPC::Message> msg, |
28 bool* is_first) = 0; | 29 bool* is_first) = 0; |
29 virtual void DrainMessages( | 30 virtual void DrainMessages( |
30 int source_frame_number, | 31 int source_frame_number, |
31 std::vector<scoped_ptr<IPC::Message>>* messages) = 0; | 32 std::vector<std::unique_ptr<IPC::Message>>* messages) = 0; |
32 | 33 |
33 private: | 34 private: |
34 DISALLOW_COPY_AND_ASSIGN(FrameSwapMessageSubQueue); | 35 DISALLOW_COPY_AND_ASSIGN(FrameSwapMessageSubQueue); |
35 }; | 36 }; |
36 | 37 |
37 namespace { | 38 namespace { |
38 | 39 |
39 // Queue specific to MESSAGE_DELIVERY_POLICY_WITH_VISUAL_STATE. | 40 // Queue specific to MESSAGE_DELIVERY_POLICY_WITH_VISUAL_STATE. |
40 class SendMessageScopeImpl : public FrameSwapMessageQueue::SendMessageScope { | 41 class SendMessageScopeImpl : public FrameSwapMessageQueue::SendMessageScope { |
41 public: | 42 public: |
(...skipping 11 matching lines...) Expand all Loading... |
53 ~VisualStateQueue() override { | 54 ~VisualStateQueue() override { |
54 for (VisualStateQueueMap::iterator i = queue_.begin(); i != queue_.end(); | 55 for (VisualStateQueueMap::iterator i = queue_.begin(); i != queue_.end(); |
55 i++) { | 56 i++) { |
56 STLDeleteElements(&i->second); | 57 STLDeleteElements(&i->second); |
57 } | 58 } |
58 } | 59 } |
59 | 60 |
60 bool Empty() const override { return queue_.empty(); } | 61 bool Empty() const override { return queue_.empty(); } |
61 | 62 |
62 void QueueMessage(int source_frame_number, | 63 void QueueMessage(int source_frame_number, |
63 scoped_ptr<IPC::Message> msg, | 64 std::unique_ptr<IPC::Message> msg, |
64 bool* is_first) override { | 65 bool* is_first) override { |
65 if (is_first) | 66 if (is_first) |
66 *is_first = (queue_.count(source_frame_number) == 0); | 67 *is_first = (queue_.count(source_frame_number) == 0); |
67 | 68 |
68 queue_[source_frame_number].push_back(msg.release()); | 69 queue_[source_frame_number].push_back(msg.release()); |
69 } | 70 } |
70 | 71 |
71 void DrainMessages(int source_frame_number, | 72 void DrainMessages( |
72 std::vector<scoped_ptr<IPC::Message>>* messages) override { | 73 int source_frame_number, |
| 74 std::vector<std::unique_ptr<IPC::Message>>* messages) override { |
73 auto end = queue_.upper_bound(source_frame_number); | 75 auto end = queue_.upper_bound(source_frame_number); |
74 for (auto i = queue_.begin(); i != end; i++) { | 76 for (auto i = queue_.begin(); i != end; i++) { |
75 DCHECK(i->first <= source_frame_number); | 77 DCHECK(i->first <= source_frame_number); |
76 for (IPC::Message* msg : i->second) { | 78 for (IPC::Message* msg : i->second) { |
77 messages->push_back(make_scoped_ptr(msg)); | 79 messages->push_back(base::WrapUnique(msg)); |
78 } | 80 } |
79 i->second.clear(); | 81 i->second.clear(); |
80 } | 82 } |
81 queue_.erase(queue_.begin(), end); | 83 queue_.erase(queue_.begin(), end); |
82 } | 84 } |
83 | 85 |
84 private: | 86 private: |
85 typedef std::map<int, std::vector<IPC::Message*> > VisualStateQueueMap; | 87 typedef std::map<int, std::vector<IPC::Message*> > VisualStateQueueMap; |
86 VisualStateQueueMap queue_; | 88 VisualStateQueueMap queue_; |
87 | 89 |
88 DISALLOW_COPY_AND_ASSIGN(VisualStateQueue); | 90 DISALLOW_COPY_AND_ASSIGN(VisualStateQueue); |
89 }; | 91 }; |
90 | 92 |
91 // Queue specific to MESSAGE_DELIVERY_POLICY_WITH_NEXT_SWAP. | 93 // Queue specific to MESSAGE_DELIVERY_POLICY_WITH_NEXT_SWAP. |
92 class SwapQueue : public FrameSwapMessageSubQueue { | 94 class SwapQueue : public FrameSwapMessageSubQueue { |
93 public: | 95 public: |
94 SwapQueue() {} | 96 SwapQueue() {} |
95 bool Empty() const override { return queue_.empty(); } | 97 bool Empty() const override { return queue_.empty(); } |
96 | 98 |
97 void QueueMessage(int source_frame_number, | 99 void QueueMessage(int source_frame_number, |
98 scoped_ptr<IPC::Message> msg, | 100 std::unique_ptr<IPC::Message> msg, |
99 bool* is_first) override { | 101 bool* is_first) override { |
100 if (is_first) | 102 if (is_first) |
101 *is_first = Empty(); | 103 *is_first = Empty(); |
102 queue_.push_back(std::move(msg)); | 104 queue_.push_back(std::move(msg)); |
103 } | 105 } |
104 | 106 |
105 void DrainMessages(int source_frame_number, | 107 void DrainMessages( |
106 std::vector<scoped_ptr<IPC::Message>>* messages) override { | 108 int source_frame_number, |
| 109 std::vector<std::unique_ptr<IPC::Message>>* messages) override { |
107 std::move(queue_.begin(), queue_.end(), std::back_inserter(*messages)); | 110 std::move(queue_.begin(), queue_.end(), std::back_inserter(*messages)); |
108 queue_.clear(); | 111 queue_.clear(); |
109 } | 112 } |
110 | 113 |
111 private: | 114 private: |
112 std::vector<scoped_ptr<IPC::Message>> queue_; | 115 std::vector<std::unique_ptr<IPC::Message>> queue_; |
113 | 116 |
114 DISALLOW_COPY_AND_ASSIGN(SwapQueue); | 117 DISALLOW_COPY_AND_ASSIGN(SwapQueue); |
115 }; | 118 }; |
116 | 119 |
117 } // namespace | 120 } // namespace |
118 | 121 |
119 FrameSwapMessageQueue::FrameSwapMessageQueue() | 122 FrameSwapMessageQueue::FrameSwapMessageQueue() |
120 : visual_state_queue_(new VisualStateQueue()), | 123 : visual_state_queue_(new VisualStateQueue()), |
121 swap_queue_(new SwapQueue()) { | 124 swap_queue_(new SwapQueue()) { |
122 } | 125 } |
(...skipping 14 matching lines...) Expand all Loading... |
137 return swap_queue_.get(); | 140 return swap_queue_.get(); |
138 break; | 141 break; |
139 case MESSAGE_DELIVERY_POLICY_WITH_VISUAL_STATE: | 142 case MESSAGE_DELIVERY_POLICY_WITH_VISUAL_STATE: |
140 return visual_state_queue_.get(); | 143 return visual_state_queue_.get(); |
141 break; | 144 break; |
142 } | 145 } |
143 NOTREACHED(); | 146 NOTREACHED(); |
144 return NULL; | 147 return NULL; |
145 } | 148 } |
146 | 149 |
147 void FrameSwapMessageQueue::QueueMessageForFrame(MessageDeliveryPolicy policy, | 150 void FrameSwapMessageQueue::QueueMessageForFrame( |
148 int source_frame_number, | 151 MessageDeliveryPolicy policy, |
149 scoped_ptr<IPC::Message> msg, | 152 int source_frame_number, |
150 bool* is_first) { | 153 std::unique_ptr<IPC::Message> msg, |
| 154 bool* is_first) { |
151 base::AutoLock lock(lock_); | 155 base::AutoLock lock(lock_); |
152 GetSubQueue(policy) | 156 GetSubQueue(policy) |
153 ->QueueMessage(source_frame_number, std::move(msg), is_first); | 157 ->QueueMessage(source_frame_number, std::move(msg), is_first); |
154 } | 158 } |
155 | 159 |
156 void FrameSwapMessageQueue::DidActivate(int source_frame_number) { | 160 void FrameSwapMessageQueue::DidActivate(int source_frame_number) { |
157 base::AutoLock lock(lock_); | 161 base::AutoLock lock(lock_); |
158 visual_state_queue_->DrainMessages(source_frame_number, | 162 visual_state_queue_->DrainMessages(source_frame_number, |
159 &next_drain_messages_); | 163 &next_drain_messages_); |
160 } | 164 } |
161 | 165 |
162 void FrameSwapMessageQueue::DidSwap(int source_frame_number) { | 166 void FrameSwapMessageQueue::DidSwap(int source_frame_number) { |
163 base::AutoLock lock(lock_); | 167 base::AutoLock lock(lock_); |
164 swap_queue_->DrainMessages(0, &next_drain_messages_); | 168 swap_queue_->DrainMessages(0, &next_drain_messages_); |
165 } | 169 } |
166 | 170 |
167 void FrameSwapMessageQueue::DidNotSwap( | 171 void FrameSwapMessageQueue::DidNotSwap( |
168 int source_frame_number, | 172 int source_frame_number, |
169 cc::SwapPromise::DidNotSwapReason reason, | 173 cc::SwapPromise::DidNotSwapReason reason, |
170 std::vector<scoped_ptr<IPC::Message>>* messages) { | 174 std::vector<std::unique_ptr<IPC::Message>>* messages) { |
171 base::AutoLock lock(lock_); | 175 base::AutoLock lock(lock_); |
172 switch (reason) { | 176 switch (reason) { |
173 case cc::SwapPromise::SWAP_FAILS: | 177 case cc::SwapPromise::SWAP_FAILS: |
174 case cc::SwapPromise::COMMIT_NO_UPDATE: | 178 case cc::SwapPromise::COMMIT_NO_UPDATE: |
175 swap_queue_->DrainMessages(source_frame_number, messages); | 179 swap_queue_->DrainMessages(source_frame_number, messages); |
176 visual_state_queue_->DrainMessages(source_frame_number, messages); | 180 visual_state_queue_->DrainMessages(source_frame_number, messages); |
177 break; | 181 break; |
178 case cc::SwapPromise::COMMIT_FAILS: | 182 case cc::SwapPromise::COMMIT_FAILS: |
179 case cc::SwapPromise::ACTIVATION_FAILS: | 183 case cc::SwapPromise::ACTIVATION_FAILS: |
180 // Do not queue any responses here. If ACTIVATION_FAILS or | 184 // Do not queue any responses here. If ACTIVATION_FAILS or |
181 // COMMIT_FAILS the renderer is shutting down, which will result | 185 // COMMIT_FAILS the renderer is shutting down, which will result |
182 // in the RenderFrameHostImpl destructor firing the remaining | 186 // in the RenderFrameHostImpl destructor firing the remaining |
183 // response callbacks itself. | 187 // response callbacks itself. |
184 break; | 188 break; |
185 } | 189 } |
186 } | 190 } |
187 | 191 |
188 void FrameSwapMessageQueue::DrainMessages( | 192 void FrameSwapMessageQueue::DrainMessages( |
189 std::vector<scoped_ptr<IPC::Message>>* messages) { | 193 std::vector<std::unique_ptr<IPC::Message>>* messages) { |
190 lock_.AssertAcquired(); | 194 lock_.AssertAcquired(); |
191 std::move(next_drain_messages_.begin(), next_drain_messages_.end(), | 195 std::move(next_drain_messages_.begin(), next_drain_messages_.end(), |
192 std::back_inserter(*messages)); | 196 std::back_inserter(*messages)); |
193 next_drain_messages_.clear(); | 197 next_drain_messages_.clear(); |
194 } | 198 } |
195 | 199 |
196 scoped_ptr<FrameSwapMessageQueue::SendMessageScope> | 200 std::unique_ptr<FrameSwapMessageQueue::SendMessageScope> |
197 FrameSwapMessageQueue::AcquireSendMessageScope() { | 201 FrameSwapMessageQueue::AcquireSendMessageScope() { |
198 return make_scoped_ptr(new SendMessageScopeImpl(&lock_)); | 202 return base::WrapUnique(new SendMessageScopeImpl(&lock_)); |
199 } | 203 } |
200 | 204 |
201 // static | 205 // static |
202 void FrameSwapMessageQueue::TransferMessages( | 206 void FrameSwapMessageQueue::TransferMessages( |
203 std::vector<scoped_ptr<IPC::Message>>* source, | 207 std::vector<std::unique_ptr<IPC::Message>>* source, |
204 vector<IPC::Message>* dest) { | 208 vector<IPC::Message>* dest) { |
205 for (const auto& msg : *source) { | 209 for (const auto& msg : *source) { |
206 dest->push_back(*msg.get()); | 210 dest->push_back(*msg.get()); |
207 } | 211 } |
208 source->clear(); | 212 source->clear(); |
209 } | 213 } |
210 | 214 |
211 } // namespace content | 215 } // namespace content |
OLD | NEW |