Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1502)

Unified Diff: media/midi/midi_manager.cc

Issue 323323002: Web MIDI: MidiManager crashes if a session is ended while initializing (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: update Created 6 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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

Powered by Google App Engine
This is Rietveld 408576698