Chromium Code Reviews| Index: media/midi/midi_manager.cc |
| diff --git a/media/midi/midi_manager.cc b/media/midi/midi_manager.cc |
| index aba8441ef8f0548ef417dcd477b8e17b934cdf19..b8e20405cf70b535ba54a13c45262016777a4e11 100644 |
| --- a/media/midi/midi_manager.cc |
| +++ b/media/midi/midi_manager.cc |
| @@ -12,7 +12,8 @@ |
| namespace media { |
| MidiManager::MidiManager() |
| - : initialized_(false), |
| + : pending_clients_size_(0), |
| + initialized_(false), |
| result_(MIDI_NOT_SUPPORTED) { |
| } |
| @@ -38,13 +39,23 @@ void MidiManager::StartSession(MidiManagerClient* client, int client_id) { |
| // Do not accept a new request if the pending client list contains too |
| // many clients. |
| too_many_pending_clients_exist = |
| - pending_clients_.size() >= kMaxPendingClientCount; |
| + pending_clients_size_ >= kMaxPendingClientCount; |
| if (!too_many_pending_clients_exist) { |
| // Call StartInitialization() only for the first request. |
| session_needs_initialization = pending_clients_.empty(); |
| - pending_clients_.insert( |
| - std::pair<int, MidiManagerClient*>(client_id, client)); |
| + PendingClientMap::iterator pending_client_iterator = |
|
yhirano
2014/06/11 12:11:57
pending_clients_[client].push_back(client_id) for
Takashi Toyoshima
2014/06/12 04:41:02
thanks.
Now that it is multiset, I just insert a p
|
| + pending_clients_.find(client); |
| + if (pending_client_iterator != pending_clients_.end()) { |
| + pending_client_iterator->second.push_back(client_id); |
| + } else { |
| + std::pair<MidiManagerClient*, std::vector<int> > entry = |
| + std::pair<MidiManagerClient*, std::vector<int> >( |
| + client, std::vector<int>()); |
| + entry.second.push_back(client_id); |
| + pending_clients_.insert(entry); |
| + } |
| + pending_clients_size_++; |
| } |
| } |
| } |
| @@ -81,9 +92,16 @@ void MidiManager::StartSession(MidiManagerClient* client, int client_id) { |
| void MidiManager::EndSession(MidiManagerClient* client) { |
| base::AutoLock auto_lock(lock_); |
| - ClientList::iterator i = clients_.find(client); |
| - if (i != clients_.end()) |
| - clients_.erase(i); |
| + ClientList::iterator client_iterator = clients_.find(client); |
|
yhirano
2014/06/11 12:11:57
std::set<T>::erase(key) works even when key doesn'
Takashi Toyoshima
2014/06/12 04:41:02
Done.
|
| + if (client_iterator != clients_.end()) |
| + clients_.erase(client_iterator); |
| + |
| + PendingClientMap::iterator pending_client_iterator = |
| + pending_clients_.find(client); |
| + if (pending_client_iterator != pending_clients_.end()) { |
| + pending_clients_size_ -= pending_client_iterator->second.size(); |
| + pending_clients_.erase(pending_client_iterator); |
| + } |
| } |
| void MidiManager::DispatchSendMidiData(MidiManagerClient* client, |
| @@ -132,7 +150,6 @@ void MidiManager::CompleteInitializationInternal(MidiResult result) { |
| base::AutoLock auto_lock(lock_); |
| DCHECK(clients_.empty()); |
| - DCHECK(!pending_clients_.empty()); |
| DCHECK(!initialized_); |
| initialized_ = true; |
| result_ = result; |
| @@ -141,10 +158,12 @@ void MidiManager::CompleteInitializationInternal(MidiResult result) { |
| it != pending_clients_.end(); |
| ++it) { |
| if (result_ == MIDI_OK) |
| - clients_.insert(it->second); |
| - it->second->CompleteStartSession(it->first, result_); |
| + clients_.insert(it->first); |
| + for (size_t i = 0; i < it->second.size(); ++i) |
| + it->first->CompleteStartSession(it->second[i], result_); |
| } |
| pending_clients_.clear(); |
| + pending_clients_size_ = 0; |
| } |
| } // namespace media |