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

Unified Diff: media/midi/midi_manager.cc

Issue 261263002: Web MIDI: add an unit test to check MidiManager instantiation (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: clean up for review 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..28e4026204c60b90026843b375ea9a60c8f503fd 100644
--- a/media/midi/midi_manager.cc
+++ b/media/midi/midi_manager.cc
@@ -4,7 +4,10 @@
#include "media/midi/midi_manager.h"
+#include "base/bind.h"
#include "base/debug/trace_event.h"
+#include "base/message_loop/message_loop.h"
+#include "base/message_loop/message_loop_proxy.h"
namespace media {
@@ -42,6 +45,8 @@ void MidiManager::StartSession(MidiManagerClient* client, int client_id) {
if (!session_is_ready) {
if (session_needs_initialization) {
TRACE_EVENT0("midi", "MidiManager::StartInitialization");
+ session_thread_runner_ =
+ base::MessageLoop::current()->message_loop_proxy();
StartInitialization();
}
// CompleteInitialization() will be called asynchronously when platform
@@ -80,23 +85,15 @@ void MidiManager::StartInitialization() {
}
void MidiManager::CompleteInitialization(MidiResult result) {
- TRACE_EVENT0("midi", "MidiManager::CompleteInitialization");
-
- base::AutoLock auto_lock(clients_lock_);
- DCHECK(clients_.empty());
- DCHECK(!pending_clients_.empty());
- DCHECK(!initialized_);
- initialized_ = true;
- result_ = result;
-
- for (PendingClientMap::iterator it = pending_clients_.begin();
- it != pending_clients_.end();
- ++it) {
- if (result_ == MIDI_OK)
- clients_.insert(it->second);
- it->second->CompleteStartSession(it->first, result_);
- }
- pending_clients_.clear();
+ DCHECK(session_thread_runner_.get());
+ // It is safe to post a task to the IO thread from here because the IO thread
+ // should have stopped if the MidiManager is going to be destructed.
+ session_thread_runner_->PostTask(
+ FROM_HERE,
+ base::Bind(&MidiManager::CompleteInitializationInternal,
+ base::Unretained(this),
+ result));
+ CompleteInitializationInternal(result);
yukawa 2014/05/04 23:16:02 Do we intentionally call CompleteInitializationInt
Takashi Toyoshima 2014/05/05 00:45:08 Oops, I removed it once, but somehow restored... T
}
void MidiManager::AddInputPort(const MidiPortInfo& info) {
@@ -118,4 +115,24 @@ void MidiManager::ReceiveMidiData(
(*i)->ReceiveMidiData(port_index, data, length, timestamp);
}
+void MidiManager::CompleteInitializationInternal(MidiResult result) {
+ TRACE_EVENT0("midi", "MidiManager::CompleteInitialization");
+
+ base::AutoLock auto_lock(clients_lock_);
+ DCHECK(clients_.empty());
+ DCHECK(!pending_clients_.empty());
+ DCHECK(!initialized_);
+ initialized_ = true;
+ result_ = result;
+
+ for (PendingClientMap::iterator it = pending_clients_.begin();
+ it != pending_clients_.end();
+ ++it) {
+ if (result_ == MIDI_OK)
+ clients_.insert(it->second);
+ it->second->CompleteStartSession(it->first, result_);
+ }
+ pending_clients_.clear();
+}
+
} // namespace media

Powered by Google App Engine
This is Rietveld 408576698