Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1603)

Unified Diff: media/gpu/ipc/service/gpu_video_encode_accelerator.cc

Issue 2849443003: Fix errors in destruction sequence of GpuVideoEncodeAccelerator::OnWillDestroyStub() (Closed)
Patch Set: Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: media/gpu/ipc/service/gpu_video_encode_accelerator.cc
diff --git a/media/gpu/ipc/service/gpu_video_encode_accelerator.cc b/media/gpu/ipc/service/gpu_video_encode_accelerator.cc
index 533e2cd95de4ed3640239454d8f7c89de8e65849..f51855b46e2f3e965935297a0098d4b41bdccc57 100644
--- a/media/gpu/ipc/service/gpu_video_encode_accelerator.cc
+++ b/media/gpu/ipc/service/gpu_video_encode_accelerator.cc
@@ -182,13 +182,7 @@ GpuVideoEncodeAccelerator::~GpuVideoEncodeAccelerator() {
// This class can only be self-deleted from OnWillDestroyStub(), which means
// the VEA has already been destroyed in there.
DCHECK(!encoder_);
- if (encoder_worker_thread_.IsRunning()) {
- encoder_worker_task_runner_->PostTask(
- FROM_HERE,
- base::Bind(&GpuVideoEncodeAccelerator::DestroyOnEncoderWorker,
- weak_this_factory_for_encoder_worker_.GetWeakPtr()));
- encoder_worker_thread_.Stop();
- }
+ DCHECK(!encoder_worker_thread_.IsRunning());
}
bool GpuVideoEncodeAccelerator::Initialize(VideoPixelFormat input_format,
@@ -325,6 +319,16 @@ void GpuVideoEncodeAccelerator::OnWillDestroyStub() {
filter_removed_.Wait();
}
+ // We should stop |encoder_worker_thread_| before releasing |encoder_|, see
+ // crbug.com/715759.
+ if (encoder_worker_thread_.IsRunning()) {
+ encoder_worker_task_runner_->PostTask(
+ FROM_HERE,
+ base::Bind(&GpuVideoEncodeAccelerator::DestroyOnEncoderWorker,
+ weak_this_factory_for_encoder_worker_.GetWeakPtr()));
sandersd (OOO until July 31) 2017/04/28 00:47:44 This WeakPtrFactory should probably not be vending
emircan 2017/04/28 01:11:09 Sure. I changed it such that we use copies of the
sandersd (OOO until July 31) 2017/04/28 18:22:44 Please document this in the header file, the curre
emircan 2017/04/29 00:10:46 Done.
+ encoder_worker_thread_.Stop();
+ }
+
stub_->channel()->RemoveRoute(host_route_id_);
stub_->RemoveDestructionObserver(this);
encoder_.reset();
@@ -517,6 +521,9 @@ void GpuVideoEncodeAccelerator::OnEncodeFrameCreated(
DVLOG(3) << __func__;
DCHECK(CheckIfCalledOnCorrectThread());
+ if (filter_removed_.IsSignaled())
+ return;
+
if (!frame) {
DLOG(ERROR) << __func__ << " could not create a frame";
NotifyError(VideoEncodeAccelerator::kPlatformFailureError);
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698