Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "content/browser/gpu/browser_gpu_channel_host_factory.h" | 5 #include "content/browser/gpu/browser_gpu_channel_host_factory.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/command_line.h" | 8 #include "base/command_line.h" |
| 9 #include "base/location.h" | 9 #include "base/location.h" |
| 10 #include "base/profiler/scoped_tracker.h" | 10 #include "base/profiler/scoped_tracker.h" |
| (...skipping 233 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 244 FROM_HERE, | 244 FROM_HERE, |
| 245 base::Bind( | 245 base::Bind( |
| 246 &BrowserGpuChannelHostFactory::InitializeShaderDiskCacheOnIO, | 246 &BrowserGpuChannelHostFactory::InitializeShaderDiskCacheOnIO, |
| 247 gpu_client_id_, cache_dir)); | 247 gpu_client_id_, cache_dir)); |
| 248 } | 248 } |
| 249 } | 249 } |
| 250 } | 250 } |
| 251 | 251 |
| 252 BrowserGpuChannelHostFactory::~BrowserGpuChannelHostFactory() { | 252 BrowserGpuChannelHostFactory::~BrowserGpuChannelHostFactory() { |
| 253 DCHECK(IsMainThread()); | 253 DCHECK(IsMainThread()); |
| 254 DCHECK(!in_shutdown_); | |
| 255 | |
| 256 in_shutdown_ = true; | |
| 254 if (pending_request_.get()) | 257 if (pending_request_.get()) |
| 255 pending_request_->Cancel(); | 258 pending_request_->Cancel(); |
| 256 for (size_t n = 0; n < established_callbacks_.size(); n++) | 259 for (size_t n = 0; n < established_callbacks_.size(); n++) |
| 257 established_callbacks_[n].Run(nullptr); | 260 established_callbacks_[n].Run(nullptr); |
| 258 shutdown_event_->Signal(); | 261 shutdown_event_->Signal(); |
| 259 if (gpu_channel_) { | 262 if (gpu_channel_) { |
| 260 gpu_channel_->DestroyChannel(); | 263 gpu_channel_->DestroyChannel(); |
| 261 gpu_channel_ = NULL; | 264 gpu_channel_ = NULL; |
| 262 } | 265 } |
| 263 } | 266 } |
| (...skipping 11 matching lines...) Expand all Loading... | |
| 275 BrowserGpuChannelHostFactory::AllocateSharedMemory(size_t size) { | 278 BrowserGpuChannelHostFactory::AllocateSharedMemory(size_t size) { |
| 276 std::unique_ptr<base::SharedMemory> shm(new base::SharedMemory()); | 279 std::unique_ptr<base::SharedMemory> shm(new base::SharedMemory()); |
| 277 if (!shm->CreateAnonymous(size)) | 280 if (!shm->CreateAnonymous(size)) |
| 278 return std::unique_ptr<base::SharedMemory>(); | 281 return std::unique_ptr<base::SharedMemory>(); |
| 279 return shm; | 282 return shm; |
| 280 } | 283 } |
| 281 | 284 |
| 282 void BrowserGpuChannelHostFactory::EstablishGpuChannel( | 285 void BrowserGpuChannelHostFactory::EstablishGpuChannel( |
| 283 const gpu::GpuChannelEstablishedCallback& callback) { | 286 const gpu::GpuChannelEstablishedCallback& callback) { |
| 284 DCHECK(!service_manager::ServiceManagerIsRemote()); | 287 DCHECK(!service_manager::ServiceManagerIsRemote()); |
| 288 | |
| 289 // Don't queue any more requests if the factory is shutting down. | |
| 290 if (in_shutdown_) | |
|
boliu
2017/02/10 22:23:02
Hmm, I guess this is ok. But how hard is it to jus
Khushal
2017/02/10 22:42:39
Another thought was to set |instance_| to null in
boliu
2017/02/10 22:45:18
I'm actually worried about accidental infinite loo
Khushal
2017/02/10 22:51:30
Maye be we should always post to the message loop
boliu
2017/02/10 23:05:22
All depends on what happens in those callbacks tod
Khushal
2017/02/10 23:24:30
I had actually looked around when thinking about p
Khushal
2017/02/11 02:10:22
So I think the simplest solution would be to just
Khushal
2017/02/13 21:07:13
Done.
| |
| 291 return; | |
| 292 | |
| 285 if (gpu_channel_.get() && gpu_channel_->IsLost()) { | 293 if (gpu_channel_.get() && gpu_channel_->IsLost()) { |
| 286 DCHECK(!pending_request_.get()); | 294 DCHECK(!pending_request_.get()); |
| 287 // Recreate the channel if it has been lost. | 295 // Recreate the channel if it has been lost. |
| 288 gpu_channel_->DestroyChannel(); | 296 gpu_channel_->DestroyChannel(); |
| 289 gpu_channel_ = NULL; | 297 gpu_channel_ = NULL; |
| 290 } | 298 } |
| 291 | 299 |
| 292 if (!gpu_channel_.get() && !pending_request_.get()) { | 300 if (!gpu_channel_.get() && !pending_request_.get()) { |
| 293 // We should only get here if the context was lost. | 301 // We should only get here if the context was lost. |
| 294 pending_request_ = EstablishRequest::Create( | 302 pending_request_ = EstablishRequest::Create( |
| (...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 376 } | 384 } |
| 377 | 385 |
| 378 // static | 386 // static |
| 379 void BrowserGpuChannelHostFactory::InitializeShaderDiskCacheOnIO( | 387 void BrowserGpuChannelHostFactory::InitializeShaderDiskCacheOnIO( |
| 380 int gpu_client_id, | 388 int gpu_client_id, |
| 381 const base::FilePath& cache_dir) { | 389 const base::FilePath& cache_dir) { |
| 382 GetShaderCacheFactorySingleton()->SetCacheInfo(gpu_client_id, cache_dir); | 390 GetShaderCacheFactorySingleton()->SetCacheInfo(gpu_client_id, cache_dir); |
| 383 } | 391 } |
| 384 | 392 |
| 385 } // namespace content | 393 } // namespace content |
| OLD | NEW |