| // Copyright 2017 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "media/mojo/services/mojo_media_log.h" |
| |
| #include "base/bind.h" |
| #include "base/logging.h" |
| #include "base/threading/sequenced_task_runner_handle.h" |
| |
| namespace media { |
| |
| MojoMediaLog::MojoMediaLog( |
| mojo::PendingRemote<mojom::MediaLog> remote_media_log, |
| scoped_refptr<base::SequencedTaskRunner> task_runner) |
| : remote_media_log_(std::move(remote_media_log)), |
| task_runner_(std::move(task_runner)) { |
| DVLOG(1) << __func__; |
| } |
| |
| MojoMediaLog::~MojoMediaLog() { |
| DVLOG(1) << __func__; |
| // Note that we're not invalidating the remote side. We're only invalidating |
| // anything that was cloned from us. Effectively, we're a log that just |
| // happens to operate via mojo. |
| InvalidateLog(); |
| } |
| |
| void MojoMediaLog::AddLogRecordLocked(std::unique_ptr<MediaLogRecord> event) { |
| DVLOG(2) << __func__; |
| DCHECK(event); |
| |
| // Don't post unless we need to. Otherwise, we can order a log entry after |
| // our own destruction. While safe, this loses the message. This can happen, |
| // for example, when we're logging why a VideoDecoder failed to initialize. |
| // It will be destroyed synchronously when Initialize returns. |
| // |
| // Also, we post here, so this is the base case. :) |
| if (task_runner_->RunsTasksInCurrentSequence()) { |
| remote_media_log_->AddLogRecord(*event); |
| return; |
| } |
| |
| // From other threads, we have little choice. |
| task_runner_->PostTask( |
| FROM_HERE, |
| base::BindOnce(&MojoMediaLog::AddLogRecord, |
| weak_ptr_factory_.GetWeakPtr(), std::move(event))); |
| } |
| |
| } // namespace media |