| 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 |