Commit c6c85490 authored by Takashi Toyoshima's avatar Takashi Toyoshima Committed by Commit Bot

MidiManager: Trivial cleanups

This patch makes several trivial changes:
 - Enforce GUARDED_BY against |clients_| and modify test only
   methods for that.
 - Initialize members in the header rather than constructor
   as we can as possible.
 - |finalized_| and |initialization_state_| do not have to be
   protected by |lock_|.
 - Enable GUARDED_BY in MidiManagerWinrt.

Bug: 672793
Change-Id: I726882c502b1d5b2414c5baa33ca31c3f630072e
Reviewed-on: https://chromium-review.googlesource.com/1249061Reviewed-by: default avatarYutaka Hirano <yhirano@chromium.org>
Commit-Queue: Takashi Toyoshima <toyoshim@chromium.org>
Cr-Commit-Position: refs/heads/master@{#595398}
parent 6caca443
...@@ -58,20 +58,11 @@ void ReportUsage(Usage usage) { ...@@ -58,20 +58,11 @@ void ReportUsage(Usage usage) {
} // namespace } // namespace
MidiManager::MidiManager(MidiService* service) MidiManager::MidiManager(MidiService* service) : service_(service) {
: initialization_state_(InitializationState::NOT_STARTED),
finalized_(false),
result_(Result::NOT_INITIALIZED),
data_sent_(false),
data_received_(false),
service_(service) {
ReportUsage(Usage::CREATED); ReportUsage(Usage::CREATED);
} }
MidiManager::~MidiManager() { MidiManager::~MidiManager() {
// Make sure that Finalize() is called to clean up resources allocated on
// the Chrome_IOThread.
base::AutoLock auto_lock(lock_);
CHECK(finalized_); CHECK(finalized_);
} }
...@@ -85,12 +76,13 @@ MidiManager* MidiManager::Create(MidiService* service) { ...@@ -85,12 +76,13 @@ MidiManager* MidiManager::Create(MidiService* service) {
void MidiManager::Shutdown() { void MidiManager::Shutdown() {
Finalize(); Finalize();
finalized_ = true;
base::AutoLock auto_lock(lock_); base::AutoLock auto_lock(lock_);
if (session_thread_runner_) if (session_thread_runner_) {
DCHECK(session_thread_runner_->BelongsToCurrentThread()); DCHECK(session_thread_runner_->BelongsToCurrentThread());
session_thread_runner_ = nullptr;
finalized_ = true; }
UMA_HISTOGRAM_ENUMERATION("Media.Midi.ResultOnShutdown", result_, UMA_HISTOGRAM_ENUMERATION("Media.Midi.ResultOnShutdown", result_,
static_cast<Sample>(Result::MAX) + 1); static_cast<Sample>(Result::MAX) + 1);
...@@ -110,18 +102,16 @@ void MidiManager::Shutdown() { ...@@ -110,18 +102,16 @@ void MidiManager::Shutdown() {
for (auto* client : clients_) for (auto* client : clients_)
client->Detach(); client->Detach();
clients_.clear(); clients_.clear();
session_thread_runner_ = nullptr;
} }
void MidiManager::StartSession(MidiManagerClient* client) { void MidiManager::StartSession(MidiManagerClient* client) {
DCHECK(!finalized_);
ReportUsage(Usage::SESSION_STARTED); ReportUsage(Usage::SESSION_STARTED);
bool needs_initialization = false; bool needs_initialization = false;
{ {
base::AutoLock auto_lock(lock_); base::AutoLock auto_lock(lock_);
DCHECK(!finalized_);
if (clients_.find(client) != clients_.end() || if (clients_.find(client) != clients_.end() ||
pending_clients_.find(client) != pending_clients_.end()) { pending_clients_.find(client) != pending_clients_.end()) {
...@@ -207,22 +197,23 @@ void MidiManager::StartInitialization() { ...@@ -207,22 +197,23 @@ void MidiManager::StartInitialization() {
} }
void MidiManager::CompleteInitialization(Result result) { void MidiManager::CompleteInitialization(Result result) {
DCHECK(!finalized_);
DCHECK_EQ(InitializationState::STARTED, initialization_state_);
TRACE_EVENT0("midi", "MidiManager::CompleteInitialization"); TRACE_EVENT0("midi", "MidiManager::CompleteInitialization");
ReportUsage(Usage::INITIALIZED); ReportUsage(Usage::INITIALIZED);
base::AutoLock auto_lock(lock_); base::AutoLock auto_lock(lock_);
if (!session_thread_runner_)
return;
DCHECK(session_thread_runner_->BelongsToCurrentThread());
UMA_HISTOGRAM_ENUMERATION("Media.Midi.InputPorts", input_ports_.size(), UMA_HISTOGRAM_ENUMERATION("Media.Midi.InputPorts", input_ports_.size(),
kMaxUmaDevices + 1); kMaxUmaDevices + 1);
UMA_HISTOGRAM_ENUMERATION("Media.Midi.OutputPorts", output_ports_.size(), UMA_HISTOGRAM_ENUMERATION("Media.Midi.OutputPorts", output_ports_.size(),
kMaxUmaDevices + 1); kMaxUmaDevices + 1);
if (!session_thread_runner_)
return;
DCHECK(session_thread_runner_->BelongsToCurrentThread());
DCHECK(!finalized_);
DCHECK(clients_.empty()); DCHECK(clients_.empty());
DCHECK_EQ(initialization_state_, InitializationState::STARTED);
initialization_state_ = InitializationState::COMPLETED; initialization_state_ = InitializationState::COMPLETED;
result_ = result; result_ = result;
...@@ -300,4 +291,13 @@ void MidiManager::ReceiveMidiData(uint32_t port_index, ...@@ -300,4 +291,13 @@ void MidiManager::ReceiveMidiData(uint32_t port_index,
client->ReceiveMidiData(port_index, data, length, timestamp); client->ReceiveMidiData(port_index, data, length, timestamp);
} }
size_t MidiManager::GetClientCountForTesting() {
base::AutoLock auto_lock(lock_);
return clients_.size();
}
size_t MidiManager::GetPendingClientCountForTesting() {
return pending_clients_.size();
}
} // namespace midi } // namespace midi
...@@ -165,10 +165,8 @@ class MIDI_EXPORT MidiManager { ...@@ -165,10 +165,8 @@ class MIDI_EXPORT MidiManager {
base::TimeTicks time); base::TimeTicks time);
// Only for testing. // Only for testing.
size_t clients_size_for_testing() const { return clients_.size(); } size_t GetClientCountForTesting();
size_t pending_clients_size_for_testing() const { size_t GetPendingClientCountForTesting();
return pending_clients_.size();
}
MidiService* service() { return service_; } MidiService* service() { return service_; }
...@@ -179,34 +177,38 @@ class MIDI_EXPORT MidiManager { ...@@ -179,34 +177,38 @@ class MIDI_EXPORT MidiManager {
COMPLETED, COMPLETED,
}; };
// Keeps track of all clients who wish to receive MIDI data. // Note: Members that are not protected by any lock should be accessed only on
// TODO(toyoshim): Enable GUARDED_BY once a testing function is fixed. // the I/O thread.
std::set<MidiManagerClient*> clients_; // GUARDED_BY(lock_);
// Keeps track of all clients who are waiting for CompleteStartSession().
std::set<MidiManagerClient*> pending_clients_;
// Keeps a SingleThreadTaskRunner of the thread that calls StartSession in
// order to invoke CompleteStartSession() on the thread.
scoped_refptr<base::SingleThreadTaskRunner> session_thread_runner_;
// Tracks platform dependent initialization state. // Tracks platform dependent initialization state.
InitializationState initialization_state_; InitializationState initialization_state_ = InitializationState::NOT_STARTED;
// Keeps false until Finalize() is called. // Keeps false until Finalize() is called.
bool finalized_; bool finalized_ = false;
// Keeps the platform dependent initialization result if initialization is // Keeps the platform dependent initialization result if initialization is
// completed. Otherwise keeps mojom::Result::NOT_INITIALIZED. // completed. Otherwise keeps mojom::Result::NOT_INITIALIZED.
mojom::Result result_; mojom::Result result_ = mojom::Result::NOT_INITIALIZED;
// Keeps track of all clients who are waiting for CompleteStartSession().
std::set<MidiManagerClient*> pending_clients_;
// Keeps track of all clients who wish to receive MIDI data.
std::set<MidiManagerClient*> clients_ GUARDED_BY(lock_);
// Keeps a SingleThreadTaskRunner of the thread that calls StartSession in
// order to invoke CompleteStartSession() on the thread. This is touched only
// on the IO thread usually, but to be guarded by |lock_| for thread checks.
scoped_refptr<base::SingleThreadTaskRunner> session_thread_runner_
GUARDED_BY(lock_);
// Keeps all MidiPortInfo. // Keeps all MidiPortInfo.
MidiPortInfoList input_ports_ GUARDED_BY(lock_); MidiPortInfoList input_ports_ GUARDED_BY(lock_);
MidiPortInfoList output_ports_ GUARDED_BY(lock_); MidiPortInfoList output_ports_ GUARDED_BY(lock_);
// Tracks if actual data transmission happens. // Tracks if actual data transmission happens.
bool data_sent_ GUARDED_BY(lock_); bool data_sent_ GUARDED_BY(lock_) = false;
bool data_received_ GUARDED_BY(lock_); bool data_received_ GUARDED_BY(lock_) = false;
// Protects members above. // Protects members above.
base::Lock lock_; base::Lock lock_;
......
...@@ -59,13 +59,9 @@ class FakeMidiManager : public MidiManager { ...@@ -59,13 +59,9 @@ class FakeMidiManager : public MidiManager {
CompleteInitialization(result); CompleteInitialization(result);
} }
size_t GetClientCount() const { size_t GetClientCount() { return GetClientCountForTesting(); }
return clients_size_for_testing();
}
size_t GetPendingClientCount() const { size_t GetPendingClientCount() { return GetPendingClientCountForTesting(); }
return pending_clients_size_for_testing();
}
bool IsInitialized() const { return initialized_; } bool IsInitialized() const { return initialized_; }
......
...@@ -850,6 +850,7 @@ void MidiManagerWinrt::SendOnComRunner(uint32_t port_index, ...@@ -850,6 +850,7 @@ void MidiManagerWinrt::SendOnComRunner(uint32_t port_index,
const std::vector<uint8_t>& data) { const std::vector<uint8_t>& data) {
DCHECK(service()->task_service()->IsOnTaskRunner(kComTaskRunner)); DCHECK(service()->task_service()->IsOnTaskRunner(kComTaskRunner));
base::AutoLock auto_lock(lazy_init_member_lock_);
MidiPort<IMidiOutPort>* port = port_manager_out_->GetPortByIndex(port_index); MidiPort<IMidiOutPort>* port = port_manager_out_->GetPortByIndex(port_index);
if (!(port && port->handle)) { if (!(port && port->handle)) {
VLOG(1) << "Port not available: " << port_index; VLOG(1) << "Port not available: " << port_index;
......
...@@ -8,6 +8,7 @@ ...@@ -8,6 +8,7 @@
#include <memory> #include <memory>
#include "base/strings/string16.h" #include "base/strings/string16.h"
#include "base/thread_annotations.h"
#include "media/midi/midi_manager.h" #include "media/midi/midi_manager.h"
namespace midi { namespace midi {
...@@ -52,10 +53,10 @@ class MIDI_EXPORT MidiManagerWinrt final : public MidiManager { ...@@ -52,10 +53,10 @@ class MIDI_EXPORT MidiManagerWinrt final : public MidiManager {
base::Lock lazy_init_member_lock_; base::Lock lazy_init_member_lock_;
// All operations to Midi{In|Out}PortManager should be done on kComTaskRunner. // All operations to Midi{In|Out}PortManager should be done on kComTaskRunner.
std::unique_ptr<MidiInPortManager> std::unique_ptr<MidiInPortManager> port_manager_in_
port_manager_in_; // GUARDED_BY(lazy_init_member_lock_) GUARDED_BY(lazy_init_member_lock_);
std::unique_ptr<MidiOutPortManager> std::unique_ptr<MidiOutPortManager> port_manager_out_
port_manager_out_; // GUARDED_BY(lazy_init_member_lock_) GUARDED_BY(lazy_init_member_lock_);
// Incremented when a MidiPortManager is ready. // Incremented when a MidiPortManager is ready.
uint8_t port_manager_ready_count_ = 0; uint8_t port_manager_ready_count_ = 0;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment