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

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: Created 6 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 | 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 FrameSwapMessageQueue::FrameSwapMessageQueue()
20 : highest_swapped_source_frame_number_(std::numeric_limits<int>::min()) {
21 }
22
23 FrameSwapMessageQueue::~FrameSwapMessageQueue() {
24 for (FrameQueueMap::iterator i = queued_messages_.begin();
25 i != queued_messages_.end();
26 i++) {
27 STLDeleteElements(&i->second);
28 }
29 }
30
31 void FrameSwapMessageQueue::QueueMessage(IPC::Message* msg) {
32 base::AutoLock lock(lock_);
33
34 queued_messages_[highest_swapped_source_frame_number_].push_back(msg);
35 }
36
37 bool FrameSwapMessageQueue::TryQueueMessage(int source_frame_number,
38 IPC::Message* msg) {
39 base::AutoLock lock(lock_);
40
41 if (highest_swapped_source_frame_number_ >= source_frame_number)
42 return false;
43
44 queued_messages_[source_frame_number].push_back(msg);
45 return true;
46 }
47
48 scoped_ptr<base::AutoLock> FrameSwapMessageQueue::DrainMessages(
49 int source_frame_number,
50 vector<IPC::Message>* messages) {
51 scoped_ptr<base::AutoLock> lock(new base::AutoLock(lock_));
52
53 DCHECK(highest_swapped_source_frame_number_ <= source_frame_number);
54 highest_swapped_source_frame_number_ = source_frame_number;
55
56 FrameQueueMap::iterator end =
57 queued_messages_.upper_bound(source_frame_number);
58 for (FrameQueueMap::iterator i = queued_messages_.begin(); i != end; i++) {
59 DCHECK(i->first <= source_frame_number);
60 TransferMessages(i->second, messages);
61 }
62
63 return lock.Pass();
64 }
65
66 // static
67 void FrameSwapMessageQueue::TransferMessages(vector<IPC::Message*>& source,
68 vector<IPC::Message>* dest) {
69 for (vector<IPC::Message*>::iterator i = source.begin(); i != source.end();
70 ++i) {
71 IPC::Message* m(*i);
72 dest->push_back(*m);
73 delete m;
74 }
75 source.clear();
76 }
77
78 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698