| Index: content/renderer/gpu/frame_swap_message_queue.cc
|
| diff --git a/content/renderer/gpu/frame_swap_message_queue.cc b/content/renderer/gpu/frame_swap_message_queue.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..6e5fbd08b8ede7852d4dbaf3f93c327834ba5db5
|
| --- /dev/null
|
| +++ b/content/renderer/gpu/frame_swap_message_queue.cc
|
| @@ -0,0 +1,60 @@
|
| +// Copyright 2014 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#include "content/renderer/gpu/frame_swap_message_queue.h"
|
| +
|
| +#include <limits>
|
| +
|
| +#include "ipc/ipc_message.h"
|
| +
|
| +namespace content {
|
| +
|
| +FrameSwapMessageQueue::FrameSwapMessageQueue():
|
| + highest_swapped_source_frame_number_(std::numeric_limits<int>::min()) {
|
| +}
|
| +
|
| +FrameSwapMessageQueue::~FrameSwapMessageQueue() {
|
| +}
|
| +
|
| +void FrameSwapMessageQueue::QueueMessage(IPC::Message* msg) {
|
| + base::AutoLock lock(lock_);
|
| +
|
| + queued_messages_[highest_swapped_source_frame_number_].push_back(msg);
|
| +}
|
| +
|
| +bool FrameSwapMessageQueue::TryQueueMessage(int source_frame_number,
|
| + IPC::Message* msg) {
|
| + base::AutoLock lock(lock_);
|
| +
|
| + if (highest_swapped_source_frame_number_ >= source_frame_number)
|
| + return false;
|
| +
|
| + queued_messages_[source_frame_number].push_back(msg);
|
| + return true;
|
| +}
|
| +
|
| +void FrameSwapMessageQueue::DrainMessages(int source_frame_number,
|
| + std::vector<IPC::Message>* messages) {
|
| + base::AutoLock lock(lock_);
|
| +
|
| + DCHECK(highest_swapped_source_frame_number_ <= source_frame_number);
|
| + highest_swapped_source_frame_number_ = source_frame_number;
|
| +
|
| + // TODO(mkosiba): rewrite before submitting.
|
| + for (FrameQueueMap::iterator i =
|
| + queued_messages_.lower_bound(source_frame_number);
|
| + i != queued_messages_.end() && i != queued_messages_.begin();
|
| + --i) {
|
| + for (std::vector<IPC::Message*>::iterator j = i->second.begin();
|
| + j != i->second.end();
|
| + ++j) {
|
| + IPC::Message* m = *j;
|
| + messages->push_back(*m);
|
| + delete m;
|
| + }
|
| + i->second.clear();
|
| + }
|
| +}
|
| +
|
| +} // namespace content
|
|
|