Chromium Code Reviews| Index: content/renderer/gpu/frame_swap_message_queue.h |
| diff --git a/content/renderer/gpu/frame_swap_message_queue.h b/content/renderer/gpu/frame_swap_message_queue.h |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..5cf37c53ac46d9eaa0e1ecdf9c389582df9fbbc0 |
| --- /dev/null |
| +++ b/content/renderer/gpu/frame_swap_message_queue.h |
| @@ -0,0 +1,92 @@ |
| +// 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. |
| + |
| +#ifndef CONTENT_RENDERER_GPU_FRAME_SWAP_MESSAGE_QUEUE_H_ |
| +#define CONTENT_RENDERER_GPU_FRAME_SWAP_MESSAGE_QUEUE_H_ |
| + |
| +#include <map> |
| +#include <vector> |
| + |
| +#include "base/auto_reset.h" |
| +#include "base/memory/ref_counted.h" |
| +#include "base/memory/scoped_ptr.h" |
| +#include "base/synchronization/lock.h" |
| +#include "content/common/content_export.h" |
| + |
| +namespace IPC { |
| +class Message; |
| +}; |
| + |
| +namespace content { |
| + |
| +// Queue used to keep track of which IPC::Messages should be sent along with a |
| +// particular compositor frame swap. |
| +class CONTENT_EXPORT FrameSwapMessageQueue |
| + : public base::RefCountedThreadSafe<FrameSwapMessageQueue> { |
| + public: |
| + class CONTENT_EXPORT SendMessageScope { |
| + public: |
| + virtual ~SendMessageScope() {} |
| + }; |
| + |
| + FrameSwapMessageQueue(); |
| + |
| + // Queues message to be returned on the next call to DrainMessages. |
| + // |
| + // |msg| - message to queue. The method takes ownership of |msg|. |
| + void QueueMessage(IPC::Message* msg); |
| + |
| + // Queues message to be returned on the first call to DrainMessages ocurring |
| + // after a DidSwapFrame call with the coresponding source_frame_number. Takes |
| + // ownership of |msg|. |
|
piman
2014/06/19 23:02:29
nit: pass scoped_ptr<IPC::Message> to be explicit
mkosiba (inactive)
2014/06/24 18:29:54
Done.
|
| + // |
| + // |source_frame_number| frame number to queue |msg| for. |
| + // |msg| - message to queue. The method takes ownership of |msg|. |
| + // |is_first| - output parameter. Set to true if this was the first message |
| + // enqueued for the given source_frame_number. |
| + void QueueMessage(int source_frame_number, IPC::Message* msg, bool* is_first); |
|
piman
2014/06/19 23:02:29
nit: no overloading... QueueMessageForFrame ?
mkosiba (inactive)
2014/06/24 18:29:54
Done.
|
| + |
| + // Returns true if there are no messages in the queue. |
| + bool Empty() const; |
| + |
| + // Makes the next call do DrainMessages return messages scheduled for any |
| + // source frame numbers less than or equal to |source_frame_number|. |
| + void AdvanceToFrame(int source_frame_number); |
| + |
| + // A SendMessageScope object must be held by the caller when this method is |
| + // called. |
| + // |
| + // |messages| vector to store messages. it's not cleared, only appended to. |
| + // The method will append messages queued for frame numbers lower |
| + // or equal to |source_frame_number| |
| + void DrainMessages(std::vector<IPC::Message>* messages); |
| + void DrainMessages(std::vector<IPC::Message*>* messages); |
|
piman
2014/06/19 23:02:29
nit: no overloading.
For the second version, it w
mkosiba (inactive)
2014/06/24 18:29:54
Done.
|
| + |
| + // SendMessageScope is used to make sure that messages sent from different |
| + // threads (impl/main) are scheduled in the right order on the IO threads. |
| + // |
| + // Returns an object that must be kept in scope till an IPC message containing |
| + // |messages| is sent. |
| + scoped_ptr<SendMessageScope> AcquireSendMessageScope(); |
| + |
| + private: |
| + friend class base::RefCountedThreadSafe<FrameSwapMessageQueue>; |
| + typedef std::map<int, std::vector<IPC::Message*> > FrameQueueMap; |
| + |
| + static void TransferMessages(std::vector<IPC::Message*>& source, |
| + std::vector<IPC::Message>* dest); |
| + |
| + ~FrameSwapMessageQueue(); |
| + |
| + mutable base::Lock lock_; |
| + int highest_swapped_source_frame_number_; |
| + FrameQueueMap queued_messages_; |
| + std::vector<IPC::Message*> next_drain_messages_; |
| + |
| + DISALLOW_COPY_AND_ASSIGN(FrameSwapMessageQueue); |
| +}; |
| + |
| +} // namespace content |
| + |
| +#endif // CONTENT_RENDERER_GPU_FRAME_SWAP_MESSAGE_QUEUE_H_ |