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

Side by Side 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: INITIALIZATION should be received synchronously, others asynchronously Created 6 years, 7 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "media/midi/midi_manager.h" 5 #include "media/midi/midi_manager.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/debug/trace_event.h" 8 #include "base/debug/trace_event.h"
9 #include "base/message_loop/message_loop.h" 9 #include "base/message_loop/message_loop.h"
10 #include "base/message_loop/message_loop_proxy.h" 10 #include "base/message_loop/message_loop_proxy.h"
11 11
12 namespace media { 12 namespace media {
13 13
14 #if !defined(OS_MACOSX) && !defined(OS_WIN) && !defined(USE_ALSA) && \
15 !defined(OS_ANDROID) && !defined(OS_CHROMEOS)
16 MidiManager* MidiManager::Create() {
17 return new MidiManager;
18 }
19 #endif
20
21 MidiManager::MidiManager() 14 MidiManager::MidiManager()
22 : initialized_(false), 15 : initialized_(false),
23 result_(MIDI_NOT_SUPPORTED) { 16 result_(MIDI_NOT_SUPPORTED) {
24 } 17 }
25 18
26 MidiManager::~MidiManager() { 19 MidiManager::~MidiManager() {
27 } 20 }
28 21
22 #if !defined(OS_MACOSX) && !defined(OS_WIN) && !defined(USE_ALSA) && \
23 !defined(OS_ANDROID) && !defined(OS_CHROMEOS)
24 MidiManager* MidiManager::Create() {
25 return new MidiManager;
26 }
27 #endif
28
29 void MidiManager::StartSession(MidiManagerClient* client, int client_id) { 29 void MidiManager::StartSession(MidiManagerClient* client, int client_id) {
30 bool session_is_ready; 30 bool session_is_ready;
31 bool session_needs_initialization = false; 31 bool session_needs_initialization = false;
32 bool too_many_pending_clients_exist = false;
32 33
33 { 34 {
34 base::AutoLock auto_lock(lock_); 35 base::AutoLock auto_lock(lock_);
35 session_is_ready = initialized_; 36 session_is_ready = initialized_;
36 if (!session_is_ready) { 37 if (!session_is_ready) {
37 // Call StartInitialization() only for the first request. 38 // Do not accept a new request if the pending client list contains too
38 session_needs_initialization = pending_clients_.empty(); 39 // many clients.
39 pending_clients_.insert( 40 too_many_pending_clients_exist =
40 std::pair<int, MidiManagerClient*>(client_id, client)); 41 pending_clients_.size() >= kMaxPendingClientCount;
42
43 if (!too_many_pending_clients_exist) {
44 // Call StartInitialization() only for the first request.
45 session_needs_initialization = pending_clients_.empty();
46 pending_clients_.insert(
47 std::pair<int, MidiManagerClient*>(client_id, client));
48 }
41 } 49 }
42 } 50 }
43 51
44 // Lazily initialize the MIDI back-end. 52 // Lazily initialize the MIDI back-end.
45 if (!session_is_ready) { 53 if (!session_is_ready) {
46 if (session_needs_initialization) { 54 if (session_needs_initialization) {
47 TRACE_EVENT0("midi", "MidiManager::StartInitialization"); 55 TRACE_EVENT0("midi", "MidiManager::StartInitialization");
48 session_thread_runner_ = 56 session_thread_runner_ =
49 base::MessageLoop::current()->message_loop_proxy(); 57 base::MessageLoop::current()->message_loop_proxy();
50 StartInitialization(); 58 StartInitialization();
51 } 59 }
60 if (too_many_pending_clients_exist) {
61 // Return an error immediately if there are too many requests.
62 client->CompleteStartSession(client_id, MIDI_INITIALIZATION_ERROR);
63 return;
64 }
52 // CompleteInitialization() will be called asynchronously when platform 65 // CompleteInitialization() will be called asynchronously when platform
53 // dependent initialization is finished. 66 // dependent initialization is finished.
54 return; 67 return;
55 } 68 }
56 69
57 // Platform dependent initialization was already finished for previously 70 // Platform dependent initialization was already finished for previously
58 // initialized clients. 71 // initialized clients.
59 MidiResult result; 72 MidiResult result;
60 { 73 {
61 base::AutoLock auto_lock(lock_); 74 base::AutoLock auto_lock(lock_);
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
128 it != pending_clients_.end(); 141 it != pending_clients_.end();
129 ++it) { 142 ++it) {
130 if (result_ == MIDI_OK) 143 if (result_ == MIDI_OK)
131 clients_.insert(it->second); 144 clients_.insert(it->second);
132 it->second->CompleteStartSession(it->first, result_); 145 it->second->CompleteStartSession(it->first, result_);
133 } 146 }
134 pending_clients_.clear(); 147 pending_clients_.clear();
135 } 148 }
136 149
137 } // namespace media 150 } // namespace media
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698