| Index: gpu/ipc/service/gpu_channel.h
|
| diff --git a/gpu/ipc/service/gpu_channel.h b/gpu/ipc/service/gpu_channel.h
|
| index 5ec1e9d748b294d787e2556eb07626eb15810ac2..cebc7a60fb21eb2098ffe588b7f3d75db0afd0ca 100644
|
| --- a/gpu/ipc/service/gpu_channel.h
|
| +++ b/gpu/ipc/service/gpu_channel.h
|
| @@ -158,8 +158,13 @@ class GPU_EXPORT GpuChannel : public IPC::Listener, public FilteredSender {
|
|
|
| GpuChannelMessageFilter* filter() const { return filter_.get(); }
|
|
|
| - void PostHandleOutOfOrderMessage(const IPC::Message& message);
|
| - void PostHandleMessage();
|
| + // Handle messages enqueued in |message_queue_|.
|
| + void HandleMessageOnQueue();
|
| +
|
| + // Some messages such as WaitForGetOffsetInRange and WaitForTokenInRange are
|
| + // processed as soon as possible because the client is blocked until they
|
| + // are completed.
|
| + void HandleOutOfOrderMessage(const IPC::Message& msg);
|
|
|
| // Synchronously handle the message to make testing convenient.
|
| void HandleMessageForTesting(const IPC::Message& msg);
|
| @@ -182,13 +187,6 @@ class GPU_EXPORT GpuChannel : public IPC::Listener, public FilteredSender {
|
|
|
| bool OnControlMessageReceived(const IPC::Message& msg);
|
|
|
| - void HandleMessage();
|
| -
|
| - // Some messages such as WaitForGetOffsetInRange and WaitForTokenInRange are
|
| - // processed as soon as possible because the client is blocked until they
|
| - // are completed.
|
| - void HandleOutOfOrderMessage(const IPC::Message& msg);
|
| -
|
| void HandleMessageHelper(const IPC::Message& msg);
|
|
|
| // Message handlers for control messages.
|
| @@ -217,7 +215,7 @@ class GPU_EXPORT GpuChannel : public IPC::Listener, public FilteredSender {
|
|
|
| std::unique_ptr<IPC::SyncChannel> channel_;
|
|
|
| - IPC::Listener* unhandled_message_listener_;
|
| + IPC::Listener* unhandled_message_listener_ = nullptr;
|
|
|
| // Used to implement message routing functionality to CommandBuffer objects
|
| IPC::MessageRouter router_;
|
| @@ -254,11 +252,11 @@ class GPU_EXPORT GpuChannel : public IPC::Listener, public FilteredSender {
|
| // Can real time streams be created on this channel.
|
| const bool allow_real_time_streams_;
|
|
|
| - base::ProcessId peer_pid_;
|
| + base::ProcessId peer_pid_ = base::kNullProcessId;
|
|
|
| - // Member variables should appear before the WeakPtrFactory, to ensure
|
| - // that any WeakPtrs to Controller are invalidated before its members
|
| - // variable's destructors are executed, rendering them invalid.
|
| + // Member variables should appear before the WeakPtrFactory, to ensure that
|
| + // any WeakPtrs to Controller are invalidated before its members variable's
|
| + // destructors are executed, rendering them invalid.
|
| base::WeakPtrFactory<GpuChannel> weak_factory_;
|
|
|
| DISALLOW_COPY_AND_ASSIGN(GpuChannel);
|
| @@ -277,8 +275,12 @@ class GPU_EXPORT GpuChannel : public IPC::Listener, public FilteredSender {
|
| // - it generates mailbox names for clients of the GPU process on the IO thread.
|
| class GPU_EXPORT GpuChannelMessageFilter : public IPC::MessageFilter {
|
| public:
|
| - explicit GpuChannelMessageFilter(
|
| - scoped_refptr<GpuChannelMessageQueue> message_queue);
|
| + GpuChannelMessageFilter(
|
| + GpuChannel* gpu_channel,
|
| + scoped_refptr<GpuChannelMessageQueue> message_queue,
|
| + scoped_refptr<base::SingleThreadTaskRunner> main_task_runner);
|
| +
|
| + void Destroy();
|
|
|
| // IPC::MessageFilter implementation.
|
| void OnFilterAdded(IPC::Channel* channel) override;
|
| @@ -293,18 +295,21 @@ class GPU_EXPORT GpuChannelMessageFilter : public IPC::MessageFilter {
|
|
|
| bool Send(IPC::Message* message);
|
|
|
| - protected:
|
| + private:
|
| ~GpuChannelMessageFilter() override;
|
|
|
| - private:
|
| bool MessageErrorHandler(const IPC::Message& message, const char* error_msg);
|
|
|
| - scoped_refptr<GpuChannelMessageQueue> message_queue_;
|
| -
|
| - IPC::Channel* channel_;
|
| - base::ProcessId peer_pid_;
|
| + IPC::Channel* ipc_channel_ = nullptr;
|
| + base::ProcessId peer_pid_ = base::kNullProcessId;
|
| std::vector<scoped_refptr<IPC::MessageFilter>> channel_filters_;
|
|
|
| + GpuChannel* gpu_channel_ = nullptr;
|
| + base::Lock gpu_channel_lock_;
|
| +
|
| + scoped_refptr<GpuChannelMessageQueue> message_queue_;
|
| + scoped_refptr<base::SingleThreadTaskRunner> main_task_runner_;
|
| +
|
| DISALLOW_COPY_AND_ASSIGN(GpuChannelMessageFilter);
|
| };
|
|
|
| @@ -325,15 +330,15 @@ struct GpuChannelMessage {
|
| class GpuChannelMessageQueue
|
| : public base::RefCountedThreadSafe<GpuChannelMessageQueue> {
|
| public:
|
| - static scoped_refptr<GpuChannelMessageQueue> Create(
|
| + GpuChannelMessageQueue(
|
| GpuChannel* channel,
|
| + scoped_refptr<base::SingleThreadTaskRunner> main_task_runner,
|
| scoped_refptr<base::SingleThreadTaskRunner> io_task_runner,
|
| scoped_refptr<PreemptionFlag> preempting_flag,
|
| scoped_refptr<PreemptionFlag> preempted_flag,
|
| SyncPointManager* sync_point_manager);
|
|
|
| - void Disable();
|
| - void DisableIO();
|
| + void Destroy();
|
|
|
| SequenceId sequence_id() const {
|
| return sync_point_order_data_->sequence_id();
|
| @@ -344,8 +349,6 @@ class GpuChannelMessageQueue
|
|
|
| bool HasQueuedMessages() const;
|
|
|
| - base::TimeTicks GetNextMessageTimeTick() const;
|
| -
|
| // Should be called before a message begins to be processed. Returns false if
|
| // there are no messages to process.
|
| const GpuChannelMessage* BeginMessageProcessing();
|
| @@ -355,7 +358,7 @@ class GpuChannelMessageQueue
|
| // there are more messages to process.
|
| void FinishMessageProcessing();
|
|
|
| - bool PushBackMessage(const IPC::Message& message);
|
| + void PushBackMessage(const IPC::Message& message);
|
|
|
| private:
|
| enum PreemptionState {
|
| @@ -376,14 +379,10 @@ class GpuChannelMessageQueue
|
|
|
| friend class base::RefCountedThreadSafe<GpuChannelMessageQueue>;
|
|
|
| - GpuChannelMessageQueue(
|
| - GpuChannel* channel,
|
| - scoped_refptr<base::SingleThreadTaskRunner> io_task_runner,
|
| - scoped_refptr<PreemptionFlag> preempting_flag,
|
| - scoped_refptr<PreemptionFlag> preempted_flag,
|
| - SyncPointManager* sync_point_manager);
|
| ~GpuChannelMessageQueue();
|
|
|
| + void PostHandleMessageOnQueue();
|
| +
|
| void UpdatePreemptionState();
|
| void UpdatePreemptionStateHelper();
|
|
|
| @@ -403,16 +402,16 @@ class GpuChannelMessageQueue
|
|
|
| // These can be accessed from both IO and main threads and are protected by
|
| // |channel_lock_|.
|
| - bool enabled_;
|
| - bool scheduled_;
|
| - GpuChannel* const channel_;
|
| + bool scheduled_ = true;
|
| + GpuChannel* channel_ = nullptr; // set to nullptr on Destroy
|
| std::deque<std::unique_ptr<GpuChannelMessage>> channel_messages_;
|
| + bool handle_message_post_task_pending_ = false;
|
| mutable base::Lock channel_lock_;
|
|
|
| // The following are accessed on the IO thread only.
|
| // No lock is necessary for preemption state because it's only accessed on the
|
| // IO thread.
|
| - PreemptionState preemption_state_;
|
| + PreemptionState preemption_state_ = IDLE;
|
| // Maximum amount of time that we can spend in PREEMPTING.
|
| // It is reset when we transition to IDLE.
|
| base::TimeDelta max_preemption_time_;
|
| @@ -423,6 +422,7 @@ class GpuChannelMessageQueue
|
| // Keeps track of sync point related state such as message order numbers.
|
| scoped_refptr<SyncPointOrderData> sync_point_order_data_;
|
|
|
| + scoped_refptr<base::SingleThreadTaskRunner> main_task_runner_;
|
| scoped_refptr<base::SingleThreadTaskRunner> io_task_runner_;
|
| scoped_refptr<PreemptionFlag> preempting_flag_;
|
| scoped_refptr<PreemptionFlag> preempted_flag_;
|
|
|