Chromium Code Reviews| Index: media/midi/midi_manager.cc |
| diff --git a/media/midi/midi_manager.cc b/media/midi/midi_manager.cc |
| index 308982d4edff72d047a44b8dcc22282bd32dbe31..95a48401c09781a26f3fceff88153bff45c03b0e 100644 |
| --- a/media/midi/midi_manager.cc |
| +++ b/media/midi/midi_manager.cc |
| @@ -38,13 +38,6 @@ enum class Usage { |
| MAX = INITIALIZED, |
| }; |
| -// Used in StartSession. |
| -enum class Completion { |
| - COMPLETE_SYNCHRONOUSLY, |
| - INVOKE_INITIALIZATION, |
| - COMPLETE_ASYNCHRONOUSLY, |
| -}; |
| - |
| void ReportUsage(Usage usage) { |
| UMA_HISTOGRAM_ENUMERATION("Media.Midi.Usage", |
| static_cast<Sample>(usage), |
| @@ -54,7 +47,9 @@ void ReportUsage(Usage usage) { |
| } // namespace |
| MidiManager::MidiManager() |
| - : initialized_(false), finalized_(false), result_(Result::NOT_INITIALIZED) { |
| + : initialization_state_(InitializationState::NOT_STARTED), |
| + finalized_(false), |
| + result_(Result::NOT_INITIALIZED) { |
| ReportUsage(Usage::CREATED); |
| } |
| @@ -91,8 +86,7 @@ void MidiManager::Shutdown() { |
| void MidiManager::StartSession(MidiManagerClient* client) { |
| ReportUsage(Usage::SESSION_STARTED); |
| - Completion completion = Completion::COMPLETE_SYNCHRONOUSLY; |
| - Result result = Result::NOT_INITIALIZED; |
| + bool needs_initialization = false; |
| { |
| base::AutoLock auto_lock(lock_); |
| @@ -103,7 +97,13 @@ void MidiManager::StartSession(MidiManagerClient* client) { |
| return; |
| } |
| - if (initialized_) { |
| + // Do not accept a new request if Shutdown() was already called. |
|
Shao-Chuan Lee
2016/10/24 08:54:34
I guess this check should be moved in front of the
Takashi Toyoshima
2016/10/24 10:07:29
Thanks, this looks a nice improvement!
|
| + if (finalized_) { |
| + client->CompleteStartSession(Result::INITIALIZATION_ERROR); |
| + return; |
| + } |
| + |
| + if (initialization_state_ == InitializationState::COMPLETED) { |
| // Platform dependent initialization was already finished for previously |
| // initialized clients. |
| if (result_ == Result::OK) { |
| @@ -111,33 +111,29 @@ void MidiManager::StartSession(MidiManagerClient* client) { |
| clients_.insert(client); |
| } |
| // Complete synchronously with |result_|; |
| - result = result_; |
| - } else { |
| - bool too_many_pending_clients_exist = |
| - pending_clients_.size() >= kMaxPendingClientCount; |
| - // Do not accept a new request if the pending client list contains too |
| - // many clients, or Shutdown() was already called. |
| - if (too_many_pending_clients_exist || finalized_) { |
| - result = Result::INITIALIZATION_ERROR; |
| - } else { |
| - // Call StartInitialization() only for the first request. |
| - if (pending_clients_.empty()) { |
| - completion = Completion::INVOKE_INITIALIZATION; |
| - session_thread_runner_ = base::ThreadTaskRunnerHandle::Get(); |
| - } else { |
| - completion = Completion::COMPLETE_ASYNCHRONOUSLY; |
| - } |
| - pending_clients_.insert(client); |
| - } |
| + client->CompleteStartSession(result_); |
| + return; |
| } |
| - if (completion == Completion::COMPLETE_SYNCHRONOUSLY) { |
| - client->CompleteStartSession(result); |
| + // Do not accept a new request if the pending client list contains too |
| + // many clients. |
| + if (pending_clients_.size() >= kMaxPendingClientCount) { |
| + client->CompleteStartSession(Result::INITIALIZATION_ERROR); |
| return; |
| } |
| + |
| + if (initialization_state_ == InitializationState::NOT_STARTED) { |
| + // Set fields protected by |lock_| here and call StartInitialization() |
| + // later. |
| + needs_initialization = true; |
| + session_thread_runner_ = base::ThreadTaskRunnerHandle::Get(); |
| + initialization_state_ = InitializationState::STARTED; |
| + } |
| + |
| + pending_clients_.insert(client); |
| } |
| - if (completion == Completion::INVOKE_INITIALIZATION) { |
| + if (needs_initialization) { |
| // Lazily initialize the MIDI back-end. |
| TRACE_EVENT0("midi", "MidiManager::StartInitialization"); |
| // CompleteInitialization() will be called asynchronously when platform |
| @@ -241,8 +237,8 @@ void MidiManager::CompleteInitializationInternal(Result result) { |
| base::AutoLock auto_lock(lock_); |
| DCHECK(clients_.empty()); |
| - DCHECK(!initialized_); |
| - initialized_ = true; |
| + DCHECK_EQ(initialization_state_, InitializationState::STARTED); |
| + initialization_state_ = InitializationState::COMPLETED; |
| result_ = result; |
| for (auto* client : pending_clients_) { |