Chromium Code Reviews| 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..332db519da9d25d716743e5285d9dd4b93e86641 100644 |
| --- a/gpu/ipc/service/gpu_channel.h |
| +++ b/gpu/ipc/service/gpu_channel.h |
| @@ -59,7 +59,9 @@ class GPU_EXPORT FilteredSender : public IPC::Sender { |
| // Encapsulates an IPC channel between the GPU process and one renderer |
| // process. On the renderer side there's a corresponding GpuChannelHost. |
| -class GPU_EXPORT GpuChannel : public IPC::Listener, public FilteredSender { |
| +class GPU_EXPORT GpuChannel : public IPC::Listener, |
| + public FilteredSender, |
| + public base::SupportsWeakPtr<GpuChannel> { |
| public: |
| // Takes ownership of the renderer process handle. |
| GpuChannel(GpuChannelManager* gpu_channel_manager, |
| @@ -110,12 +112,12 @@ class GPU_EXPORT GpuChannel : public IPC::Listener, public FilteredSender { |
| uint64_t client_tracing_id() const { return client_tracing_id_; } |
| - base::WeakPtr<GpuChannel> AsWeakPtr(); |
| - |
| scoped_refptr<base::SingleThreadTaskRunner> io_task_runner() const { |
| return io_task_runner_; |
| } |
| + void HandleMessageOnIOThread(const IPC::Message& msg); |
| + |
| // IPC::Listener implementation: |
| bool OnMessageReceived(const IPC::Message& msg) override; |
| void OnChannelConnected(int32_t peer_pid) override; |
| @@ -158,8 +160,8 @@ class GPU_EXPORT GpuChannel : public IPC::Listener, public FilteredSender { |
| GpuChannelMessageFilter* filter() const { return filter_.get(); } |
| + void PostHandleMessageOnQueue(); |
| void PostHandleOutOfOrderMessage(const IPC::Message& message); |
| - void PostHandleMessage(); |
| // Synchronously handle the message to make testing convenient. |
| void HandleMessageForTesting(const IPC::Message& msg); |
| @@ -182,7 +184,7 @@ class GPU_EXPORT GpuChannel : public IPC::Listener, public FilteredSender { |
| bool OnControlMessageReceived(const IPC::Message& msg); |
| - void HandleMessage(); |
| + void HandleMessageOnQueue(); |
| // Some messages such as WaitForGetOffsetInRange and WaitForTokenInRange are |
| // processed as soon as possible because the client is blocked until they |
| @@ -256,11 +258,6 @@ class GPU_EXPORT GpuChannel : public IPC::Listener, public FilteredSender { |
| base::ProcessId peer_pid_; |
| - // 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. |
|
piman
2017/03/24 04:31:40
I think we should keep this property. Using Suppor
sunnyps
2017/03/24 21:27:22
Done.
|
| - base::WeakPtrFactory<GpuChannel> weak_factory_; |
| - |
| DISALLOW_COPY_AND_ASSIGN(GpuChannel); |
| }; |
| @@ -277,8 +274,9 @@ 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); |
| + explicit GpuChannelMessageFilter(GpuChannel* gpu_channel); |
| + |
| + void Destroy(); |
| // IPC::MessageFilter implementation. |
| void OnFilterAdded(IPC::Channel* channel) override; |
| @@ -293,17 +291,16 @@ 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 lock_; |
| DISALLOW_COPY_AND_ASSIGN(GpuChannelMessageFilter); |
| }; |
| @@ -332,8 +329,7 @@ class GpuChannelMessageQueue |
| 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 +340,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 +349,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 { |
| @@ -403,7 +397,6 @@ 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_; |
| std::deque<std::unique_ptr<GpuChannelMessage>> channel_messages_; |