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

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

Issue 240163005: Deliver IPC messages together with SwapCompositorFrame (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: don't use unknown to break the promise on deletion Created 6 years, 6 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 | Annotate | Revision Log
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_swap_message_queue.h"
6
7 #include <limits>
8
9 #include "base/logging.h"
10 #include "base/stl_util.h"
11 #include "ipc/ipc_message.h"
12
13 using std::vector;
14
15 namespace content {
16
17 namespace {
18
19 class SendMessageScopeImpl : public FrameSwapMessageQueue::SendMessageScope {
20 public:
21 SendMessageScopeImpl(base::Lock* lock) : auto_lock_(*lock) {}
22 virtual ~SendMessageScopeImpl() OVERRIDE {}
23
24 private:
25 base::AutoLock auto_lock_;
26 };
27
28 } // namespace
29
30 FrameSwapMessageQueue::FrameSwapMessageQueue()
31 : highest_swapped_source_frame_number_(std::numeric_limits<
32 typeof(highest_swapped_source_frame_number_)>::min()) {
33 }
34
35 FrameSwapMessageQueue::~FrameSwapMessageQueue() {
36 for (FrameQueueMap::iterator i = queued_messages_.begin();
37 i != queued_messages_.end();
38 i++) {
39 STLDeleteElements(&i->second);
40 }
41 STLDeleteElements(&next_drain_messages_);
42 }
43
44 bool FrameSwapMessageQueue::Empty() const {
45 base::AutoLock lock(lock_);
46 return queued_messages_.empty() && next_drain_messages_.empty();
47 }
48
49 void FrameSwapMessageQueue::QueueMessage(IPC::Message* msg) {
50 base::AutoLock lock(lock_);
51 next_drain_messages_.push_back(msg);
52 }
53
54 void FrameSwapMessageQueue::QueueMessage(int source_frame_number,
55 IPC::Message* msg,
56 bool* is_first) {
57 base::AutoLock lock(lock_);
58 DCHECK(source_frame_number >= highest_swapped_source_frame_number_);
59
60 if (is_first)
61 *is_first = (queued_messages_.count(source_frame_number) == 0);
62
63 queued_messages_[source_frame_number].push_back(msg);
64 }
65
66 void FrameSwapMessageQueue::AdvanceToFrame(int source_frame_number) {
67 base::AutoLock lock(lock_);
68
69 if (highest_swapped_source_frame_number_ > source_frame_number)
70 return;
71 highest_swapped_source_frame_number_ = source_frame_number;
72
73 FrameQueueMap::iterator end =
74 queued_messages_.upper_bound(source_frame_number);
75 for (FrameQueueMap::iterator i = queued_messages_.begin(); i != end; i++) {
76 DCHECK(i->first <= source_frame_number);
77 next_drain_messages_.insert(
78 next_drain_messages_.end(), i->second.begin(), i->second.end());
79 i->second.clear();
80 }
81 queued_messages_.erase(queued_messages_.begin(), end);
82 }
83
84 void FrameSwapMessageQueue::DrainMessages(
85 vector<IPC::Message>* messages) {
86 std::vector<IPC::Message*> message_ptrs;
87 DrainMessages(&message_ptrs);
88 TransferMessages(message_ptrs, messages);
89 }
90
91 void FrameSwapMessageQueue::DrainMessages(
92 std::vector<IPC::Message*>* messages) {
93 lock_.AssertAcquired();
94 messages->swap(next_drain_messages_);
95 next_drain_messages_.clear();
96 }
97
98 scoped_ptr<FrameSwapMessageQueue::SendMessageScope>
99 FrameSwapMessageQueue::AcquireSendMessageScope() {
100 return make_scoped_ptr(new SendMessageScopeImpl(&lock_))
101 .PassAs<SendMessageScope>();
102 }
103
104 // static
105 void FrameSwapMessageQueue::TransferMessages(vector<IPC::Message*>& source,
106 vector<IPC::Message>* dest) {
107 for (vector<IPC::Message*>::iterator i = source.begin(); i != source.end();
108 ++i) {
109 IPC::Message* m(*i);
110 dest->push_back(*m);
111 delete m;
112 }
113 source.clear();
114 }
115
116 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698