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

Unified Diff: media/midi/midi_manager.cc

Issue 264053002: Web MIDI: introduce pending client count limit to start sessions (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: fix memory leak Created 6 years, 8 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 67845cef08d5b2c49add1954b5041d96045e5676..91eb5f5daab252fbb118aaac995da53bc0d8a779 100644
--- a/media/midi/midi_manager.cc
+++ b/media/midi/midi_manager.cc
@@ -8,13 +8,6 @@
namespace media {
-#if !defined(OS_MACOSX) && !defined(OS_WIN) && !defined(USE_ALSA) && \
- !defined(OS_ANDROID) && !defined(OS_CHROMEOS)
-MidiManager* MidiManager::Create() {
- return new MidiManager;
-}
-#endif
-
MidiManager::MidiManager()
: initialized_(false),
result_(MIDI_NOT_SUPPORTED) {
@@ -23,18 +16,33 @@ MidiManager::MidiManager()
MidiManager::~MidiManager() {
}
+#if !defined(OS_MACOSX) && !defined(OS_WIN) && !defined(USE_ALSA) && \
+ !defined(OS_ANDROID) && !defined(OS_CHROMEOS)
+MidiManager* MidiManager::Create() {
+ return new MidiManager;
+}
+#endif
+
void MidiManager::StartSession(MidiManagerClient* client, int client_id) {
bool session_is_ready;
bool session_needs_initialization = false;
+ bool too_many_pending_clients_exist = false;
{
base::AutoLock auto_lock(clients_lock_);
session_is_ready = initialized_;
if (!session_is_ready) {
- // Call StartInitialization() only for the first request.
- session_needs_initialization = pending_clients_.empty();
- pending_clients_.insert(
- std::pair<int, MidiManagerClient*>(client_id, client));
+ // Do not accept a new request if the pending client list contains too
+ // many clients.
+ too_many_pending_clients_exist =
+ 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));
+ }
}
}
@@ -44,6 +52,11 @@ void MidiManager::StartSession(MidiManagerClient* client, int client_id) {
TRACE_EVENT0("midi", "MidiManager::StartInitialization");
StartInitialization();
}
+ if (too_many_pending_clients_exist) {
yukawa 2014/05/04 22:44:54 |too_many_pending_clients_exist| isn't guarded by
Takashi Toyoshima 2014/05/04 23:28:44 We do not want to hold |clients_lock_| to invoke v
yukawa 2014/05/04 23:45:55 Got it. Thanks.
+ // Return an error immediately if there are too many requests.
+ client->CompleteStartSession(client_id, MIDI_INITIALIZATION_ERROR);
+ return;
+ }
// CompleteInitialization() will be called asynchronously when platform
// dependent initialization is finished.
return;

Powered by Google App Engine
This is Rietveld 408576698