Chromium Code Reviews| Index: content/common/gpu/gpu_channel.h |
| diff --git a/content/common/gpu/gpu_channel.h b/content/common/gpu/gpu_channel.h |
| index c51baa800265f9682f39e30c18b98c3672629ba6..5b280fa3814319e84471b50c47f5fa19f96520f9 100644 |
| --- a/content/common/gpu/gpu_channel.h |
| +++ b/content/common/gpu/gpu_channel.h |
| @@ -8,11 +8,14 @@ |
| #include <deque> |
| #include <string> |
| +#include "base/atomicops.h" |
| #include "base/containers/scoped_ptr_hash_map.h" |
| #include "base/memory/ref_counted.h" |
| #include "base/memory/scoped_ptr.h" |
| #include "base/memory/weak_ptr.h" |
| #include "base/process/process.h" |
| +#include "base/synchronization/lock.h" |
| +#include "base/timer/timer.h" |
| #include "base/trace_event/memory_dump_provider.h" |
| #include "build/build_config.h" |
| #include "content/common/content_export.h" |
| @@ -95,6 +98,19 @@ class CONTENT_EXPORT GpuChannel |
| return io_task_runner_; |
| } |
| + // Thread-safe channel message functions. |
| + bool HasQueuedMessages(); |
| + base::TimeTicks GetNextMessageTimeTick(); |
| + void PushBackMessage(uint32_t order_number, const IPC::Message& message); |
| + void PushFrontMessage(const IPC::Message& message); |
| + |
| + // TODO(dyen): Temporary sync point insertion hook. |
| + void PushSyncPointMessage(uint32_t order_number, const IPC::Message& message, |
| + bool retire_sync_point, uint32_t sync_point_num); |
| + |
| + // Process channel message from main thread. |
| + void ProcessMessage(uint32_t order_number, const IPC::Message& message); |
| + |
| // IPC::Listener implementation: |
| bool OnMessageReceived(const IPC::Message& msg) override; |
| void OnChannelError() override; |
| @@ -145,7 +161,6 @@ class CONTENT_EXPORT GpuChannel |
| gpu::PreemptionFlag* GetPreemptionFlag(); |
| bool handle_messages_scheduled() const { return handle_messages_scheduled_; } |
| - uint64 messages_processed() const { return messages_processed_; } |
| // If |preemption_flag->IsSet()|, any stub on this channel |
| // should stop issuing GL commands. Setting this to NULL stops deferral. |
| @@ -175,6 +190,12 @@ class CONTENT_EXPORT GpuChannel |
| return pending_valuebuffer_state_.get(); |
| } |
| + uint32_t GetCurrentOrderNum() const { return current_order_num_; } |
| + uint32_t GetProcessedOrderNum() const { return processed_order_num_; } |
| + uint32_t GetUnprocessedOrderNum() const { |
| + return base::subtle::Acquire_Load(&unprocessed_order_num_); |
| + } |
| + |
| protected: |
| // The message filter on the io thread. |
| scoped_refptr<GpuChannelMessageFilter> filter_; |
| @@ -200,8 +221,13 @@ class CONTENT_EXPORT GpuChannel |
| void OnDestroyCommandBuffer(int32 route_id); |
| void OnCreateJpegDecoder(int32 route_id, IPC::Message* reply_msg); |
| - // Decrement the count of unhandled IPC messages and defer preemption. |
| - void MessageProcessed(); |
| + void PushUnfinishedMessage(uint32_t order_number, |
| + const IPC::Message& message); |
| + void ScheduleHandleMessage(); |
| + void ScheduleHandleMessageLocked(); |
| + |
| + // Update processed order number and defer preemption. |
| + void MessageProcessed(uint32_t order_number); |
| // The lifetime of objects of this class is managed by a GpuChannelManager. |
| // The GpuChannelManager destroy all the GpuChannels that they own when they |
| @@ -216,8 +242,6 @@ class CONTENT_EXPORT GpuChannel |
| // Used to implement message routing functionality to CommandBuffer objects |
| MessageRouter router_; |
| - uint64 messages_processed_; |
| - |
| // Whether the processing of IPCs on this channel is stalled and we should |
| // preempt other GpuChannels. |
| scoped_refptr<gpu::PreemptionFlag> preempting_flag_; |
| @@ -226,7 +250,28 @@ class CONTENT_EXPORT GpuChannel |
| // commands (via their GpuScheduler) when preempted_flag_->IsSet() |
| scoped_refptr<gpu::PreemptionFlag> preempted_flag_; |
| - std::deque<IPC::Message*> deferred_messages_; |
| + struct ChannelMessage { |
| + uint32_t order_number; |
| + base::TimeTicks time_received; |
| + IPC::Message message; |
| + |
| + // TODO(dyen): Temporary sync point data, remove once new sync point lands. |
| + bool retire_sync_point; |
| + uint32 sync_point_number; |
| + |
| + ChannelMessage(uint32_t order_num, const IPC::Message& msg) |
| + : order_number(order_num), |
| + time_received(base::TimeTicks::Now()), |
| + message(msg), |
| + retire_sync_point(false), |
| + sync_point_number(0) {} |
| + }; |
|
piman
2015/08/31 23:15:04
nit: move to before OnDestroy (within each visibli
David Yen
2015/09/01 02:01:52
Done.
|
| + bool handle_messages_scheduled_; |
| + std::deque<ChannelMessage*> channel_messages_; |
| + |
| + // This lock protects both handle_messages_scheduled_ and channel_messages_. |
| + base::Lock channel_messages_lock_; |
| + |
| // The id of the client who is on the other side of the channel. |
| int client_id_; |
| @@ -253,11 +298,18 @@ class CONTENT_EXPORT GpuChannel |
| gpu::gles2::DisallowedFeatures disallowed_features_; |
| GpuWatchdog* watchdog_; |
| bool software_; |
| - bool handle_messages_scheduled_; |
| - IPC::Message* currently_processing_message_; |
| + ChannelMessage* currently_processing_message_; |
| - size_t num_stubs_descheduled_; |
| + // Current IPC order number being processed. |
| + uint32_t current_order_num_; |
| + // Last finished IPC order number. |
| + uint32_t processed_order_num_; |
| + |
| + // Highest IPC order number seen, set when queued on the IO thread. |
| + base::subtle::Atomic32 unprocessed_order_num_; |
|
piman
2015/08/31 23:15:04
As far as I can tell, this is only used in a DCHEC
David Yen
2015/09/01 02:01:52
This is going to be used later in the actual sync
|
| + |
| + size_t num_stubs_descheduled_; |
| bool allow_future_sync_points_; |
| // Member variables should appear before the WeakPtrFactory, to ensure |