Index: media/midi/midi_manager_mac_unittest.cc |
diff --git a/media/midi/midi_manager_mac_unittest.cc b/media/midi/midi_manager_mac_unittest.cc |
index e608d7c6ede7a517bda627c9b1cdea0e37be27ed..092af8725b4a78da5dbe1ef1418aab587e806b19 100644 |
--- a/media/midi/midi_manager_mac_unittest.cc |
+++ b/media/midi/midi_manager_mac_unittest.cc |
@@ -10,6 +10,7 @@ |
#include "base/memory/scoped_ptr.h" |
#include "base/message_loop/message_loop.h" |
#include "base/run_loop.h" |
+#include "base/synchronization/lock.h" |
#include "testing/gtest/include/gtest/gtest.h" |
namespace media { |
@@ -20,15 +21,24 @@ void Noop(const MIDIPacketList*, void*, void*) {} |
class FakeMidiManagerClient : public MidiManagerClient { |
public: |
- FakeMidiManagerClient() |
- : result_(MIDI_NOT_SUPPORTED), |
- wait_for_result_(true), |
- wait_for_port_(true) {} |
+ FakeMidiManagerClient() { |
+ base::AutoLock lock(lock_); |
yhirano
2015/03/02 04:58:37
It's hard to imagine that anyone can touch a FakeM
Takashi Toyoshima
2015/03/02 10:52:18
I placed it not to avoid from racing, but for expl
|
+ result_ = MIDI_NOT_SUPPORTED; |
+ wait_for_result_ = true; |
+ wait_for_port_ = true; |
+ } |
// MidiManagerClient implementation. |
void AddInputPort(const MidiPortInfo& info) override {} |
void AddOutputPort(const MidiPortInfo& info) override { |
- CHECK(!wait_for_result_); |
+ base::AutoLock lock(lock_); |
+ // AddOutputPort may be called before CompleteStartSession() is invoked |
+ // if one or more MIDI devices including virtual ports are connected. |
+ // Just ignore in such cases. |
+ if (wait_for_result_) |
+ return; |
+ |
+ EXPECT_TRUE(wait_for_port_); |
yhirano
2015/03/02 04:58:37
This function is not called on the test thread. I'
Takashi Toyoshima
2015/03/02 10:52:17
I placed AutoLock at line 34 since wait_for_result
Takashi Toyoshima
2015/03/02 11:06:21
Oh, I misunderstood your comment.
I'll check docum
|
info_ = info; |
wait_for_port_ = false; |
} |
@@ -36,6 +46,7 @@ class FakeMidiManagerClient : public MidiManagerClient { |
void SetOutputPortState(uint32 port_index, MidiPortState state) override {} |
void CompleteStartSession(MidiResult result) override { |
+ base::AutoLock lock(lock_); |
EXPECT_TRUE(wait_for_result_); |
result_ = result; |
wait_for_result_ = false; |
@@ -45,15 +56,25 @@ class FakeMidiManagerClient : public MidiManagerClient { |
double timestamp) override {} |
void AccumulateMidiBytesSent(size_t size) override {} |
+ bool GetWaitForResult() { |
+ base::AutoLock lock(lock_); |
+ return wait_for_result_; |
+ } |
+ |
+ bool GetWaitForPort() { |
+ base::AutoLock lock(lock_); |
+ return wait_for_port_; |
+ } |
+ |
MidiResult WaitForResult() { |
- while (wait_for_result_) { |
+ while (GetWaitForResult()) { |
base::RunLoop run_loop; |
run_loop.RunUntilIdle(); |
} |
return result_; |
} |
MidiPortInfo WaitForPort() { |
- while (wait_for_port_) { |
+ while (GetWaitForPort()) { |
base::RunLoop run_loop; |
run_loop.RunUntilIdle(); |
} |
@@ -61,6 +82,7 @@ class FakeMidiManagerClient : public MidiManagerClient { |
} |
private: |
+ base::Lock lock_; |
MidiResult result_; |
bool wait_for_result_; |
MidiPortInfo info_; |