Chromium Code Reviews| Index: media/midi/midi_manager.cc |
| diff --git a/media/midi/midi_manager.cc b/media/midi/midi_manager.cc |
| index 6e8c1a266fa86502407d929db218eb1e85afc1f5..90e0c91334b87d5f1e42cbcc85d7e2a60cfc65ce 100644 |
| --- a/media/midi/midi_manager.cc |
| +++ b/media/midi/midi_manager.cc |
| @@ -43,14 +43,14 @@ void ReportUsage(Usage usage) { |
| } // namespace |
| MidiManager::MidiManager() |
| - : initialized_(false), result_(Result::NOT_INITIALIZED) { |
| + : initialized_(false), finalized_(false), result_(Result::NOT_INITIALIZED) { |
| ReportUsage(Usage::CREATED); |
| } |
| MidiManager::~MidiManager() { |
| - UMA_HISTOGRAM_ENUMERATION("Media.Midi.ResultOnShutdown", |
| - static_cast<Sample>(result_), |
| - static_cast<Sample>(Result::MAX) + 1); |
| + // Make sure that Finalize() is called to clean up resources allocated on |
| + // the Chrome_IOThread. |
| + DCHECK(finalized_); |
| } |
| #if !defined(OS_MACOSX) && !defined(OS_WIN) && \ |
| @@ -61,6 +61,21 @@ MidiManager* MidiManager::Create() { |
| } |
| #endif |
| +void MidiManager::Shutdown() { |
| + UMA_HISTOGRAM_ENUMERATION("Media.Midi.ResultOnShutdown", |
| + static_cast<int>(result_), |
| + static_cast<int>(Result::MAX) + 1); |
| + base::AutoLock auto_lock(lock_); |
| + if (session_thread_runner_) { |
| + session_thread_runner_->PostTask( |
| + FROM_HERE, base::Bind(&MidiManager::ShutdownOnSessionThread, |
| + base::Unretained(this))); |
| + session_thread_runner_ = nullptr; |
| + } else { |
| + finalized_ = true; |
| + } |
| +} |
| + |
| void MidiManager::StartSession(MidiManagerClient* client) { |
| ReportUsage(Usage::SESSION_STARTED); |
| @@ -95,8 +110,13 @@ void MidiManager::StartSession(MidiManagerClient* client) { |
| if (!session_is_ready) { |
| if (session_needs_initialization) { |
| TRACE_EVENT0("midi", "MidiManager::StartInitialization"); |
| - session_thread_runner_ = |
| - base::MessageLoop::current()->task_runner(); |
| + { |
| + base::AutoLock auto_lock(lock_); |
| + // Stop calling StartInitialization() if Shutdown() was already called. |
| + if (finalized_) |
|
yhirano
2015/09/11 15:59:47
Should we call CompleteStartSession with INITIALIZ
Takashi Toyoshima
2015/09/17 07:30:49
This isn't easy because I do not want to call clie
|
| + return; |
| + session_thread_runner_ = base::MessageLoop::current()->task_runner(); |
| + } |
| StartInitialization(); |
| } |
| if (too_many_pending_clients_exist) { |
| @@ -154,14 +174,12 @@ void MidiManager::StartInitialization() { |
| } |
| void MidiManager::CompleteInitialization(Result result) { |
| - DCHECK(session_thread_runner_.get()); |
| - // It is safe to post a task to the IO thread from here because the IO thread |
| - // should have stopped if the MidiManager is going to be destructed. |
| - session_thread_runner_->PostTask( |
| - FROM_HERE, |
| - base::Bind(&MidiManager::CompleteInitializationInternal, |
| - base::Unretained(this), |
| - result)); |
| + base::AutoLock auto_lock(lock_); |
| + if (session_thread_runner_) { |
| + session_thread_runner_->PostTask( |
| + FROM_HERE, base::Bind(&MidiManager::CompleteInitializationInternal, |
| + base::Unretained(this), result)); |
| + } |
| } |
| void MidiManager::AddInputPort(const MidiPortInfo& info) { |
| @@ -242,5 +260,11 @@ void MidiManager::AddInitialPorts(MidiManagerClient* client) { |
| client->AddOutputPort(info); |
| } |
| +void MidiManager::ShutdownOnSessionThread() { |
| + Finalize(); |
| + base::AutoLock auto_lock(lock_); |
| + finalized_ = true; |
| +} |
| + |
| } // namespace midi |
| } // namespace media |