diff options
-rw-r--r-- | mojo/public/cpp/system/tests/watcher_unittest.cc | 20 | ||||
-rw-r--r-- | mojo/public/cpp/system/watcher.cc | 4 |
2 files changed, 23 insertions, 1 deletions
diff --git a/mojo/public/cpp/system/tests/watcher_unittest.cc b/mojo/public/cpp/system/tests/watcher_unittest.cc index ea78a56..f72f495 100644 --- a/mojo/public/cpp/system/tests/watcher_unittest.cc +++ b/mojo/public/cpp/system/tests/watcher_unittest.cc @@ -182,5 +182,25 @@ TEST_F(WatcherTest, NotifyOnMessageLoopDestruction) { b_watcher.Cancel(); } +TEST_F(WatcherTest, CloseAndCancel) { + ScopedMessagePipeHandle a, b; + CreateMessagePipe(nullptr, &a, &b); + + Watcher b_watcher; + EXPECT_EQ(MOJO_RESULT_OK, + b_watcher.Start(b.get(), MOJO_HANDLE_SIGNAL_READABLE, + OnReady([](MojoResult result) { FAIL(); }))); + EXPECT_TRUE(b_watcher.IsWatching()); + + // This should trigger the watcher above... + b.reset(); + // ...but the watcher is cancelled first. + b_watcher.Cancel(); + + EXPECT_FALSE(b_watcher.IsWatching()); + + base::RunLoop().RunUntilIdle(); +} + } // namespace } // namespace mojo diff --git a/mojo/public/cpp/system/watcher.cc b/mojo/public/cpp/system/watcher.cc index ad965ff..5723533 100644 --- a/mojo/public/cpp/system/watcher.cc +++ b/mojo/public/cpp/system/watcher.cc @@ -96,7 +96,9 @@ void Watcher::Cancel() { MojoResult result = MojoCancelWatch(handle_.value(), reinterpret_cast<uintptr_t>(this)); message_loop_observer_.reset(); - DCHECK_EQ(result, MOJO_RESULT_OK); + // |result| may be MOJO_RESULT_INVALID_ARGUMENT if |handle_| has closed, but + // OnHandleReady has not yet been called. + DCHECK(result == MOJO_RESULT_INVALID_ARGUMENT || result == MOJO_RESULT_OK); handle_.set_value(kInvalidHandleValue); callback_.Reset(); } |