Add //mojo/edk/platform/thread_utils.* containing "yield" and "sleep".
Remove //mojo/edk/system/test/sleep*.
R=vardhan@google.com
Review URL: https://codereview.chromium.org/1639093002 .
diff --git a/mojo/edk/base_edk/BUILD.gn b/mojo/edk/base_edk/BUILD.gn
index 1a3a9da..c268f4e 100644
--- a/mojo/edk/base_edk/BUILD.gn
+++ b/mojo/edk/base_edk/BUILD.gn
@@ -17,6 +17,7 @@
"platform_message_loop_impl.h",
"platform_task_runner_impl.cc",
"platform_task_runner_impl.h",
+ "thread_utils.cc",
]
deps = [
diff --git a/mojo/edk/base_edk/thread_utils.cc b/mojo/edk/base_edk/thread_utils.cc
new file mode 100644
index 0000000..611bffc
--- /dev/null
+++ b/mojo/edk/base_edk/thread_utils.cc
@@ -0,0 +1,36 @@
+// Copyright 2016 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// This file implements the functions declared in
+// //mojo/edk/platform/thread_utils.h.
+
+#include "mojo/edk/platform/thread_utils.h"
+
+#include <stdint.h>
+
+#include <limits>
+
+#include "base/logging.h"
+#include "base/threading/platform_thread.h"
+#include "base/time/time.h"
+
+namespace mojo {
+namespace platform {
+
+void ThreadYield() {
+ base::PlatformThread::YieldCurrentThread();
+}
+
+void ThreadSleep(MojoDeadline duration) {
+ // Note: This also effectively checks that |duration| isn't
+ // |MOJO_DEADLINE_INDEFINITE|.
+ DCHECK_LE(duration,
+ static_cast<MojoDeadline>(std::numeric_limits<int64_t>::max()));
+
+ base::PlatformThread::Sleep(
+ base::TimeDelta::FromMicroseconds(static_cast<int64_t>(duration)));
+}
+
+} // namespace platform
+} // namespace mojo
diff --git a/mojo/edk/platform/BUILD.gn b/mojo/edk/platform/BUILD.gn
index f03b712..3a30b7f 100644
--- a/mojo/edk/platform/BUILD.gn
+++ b/mojo/edk/platform/BUILD.gn
@@ -18,6 +18,7 @@
"scoped_platform_handle.h",
"task_runner.h",
"thread.h",
+ "thread_utils.h",
]
mojo_sdk_public_deps = [ "mojo/public/cpp/system" ]
@@ -59,6 +60,7 @@
"aligned_alloc_unittest.cc",
"io_thread_unittest.cc",
"test_message_loops_unittest.cc",
+ "thread_utils_unittest.cc",
]
deps = [
@@ -67,5 +69,10 @@
"//testing/gtest",
]
+ # TODO(vtl): This is a suboptimal dependency. Probably "Stopwatch" should be
+ # moved to :test_platform (which we can do after we add a clock/time function
+ # to :platform).
+ mojo_edk_deps = [ "mojo/edk/system/test" ]
+
mojo_sdk_deps = [ "mojo/public/cpp/system" ]
}
diff --git a/mojo/edk/platform/thread_utils.h b/mojo/edk/platform/thread_utils.h
new file mode 100644
index 0000000..0336b86
--- /dev/null
+++ b/mojo/edk/platform/thread_utils.h
@@ -0,0 +1,24 @@
+// Copyright 2016 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef MOJO_EDK_PLATFORM_THREAD_UTILS_H_
+#define MOJO_EDK_PLATFORM_THREAD_UTILS_H_
+
+#include "mojo/public/c/system/types.h"
+
+namespace mojo {
+namespace platform {
+
+// Causes the calling thread to try to yield (allowing another thread to be
+// scheduled).
+void ThreadYield();
+
+// Causes the calling thread to sleep for at least the specified duration (which
+// must not be |MOJO_DEADLINE_INDEFINITE|).
+void ThreadSleep(MojoDeadline duration);
+
+} // namespace platform
+} // namespace mojo
+
+#endif // MOJO_EDK_PLATFORM_THREAD_UTILS_H_
diff --git a/mojo/edk/platform/thread_utils_unittest.cc b/mojo/edk/platform/thread_utils_unittest.cc
new file mode 100644
index 0000000..8d65a4f
--- /dev/null
+++ b/mojo/edk/platform/thread_utils_unittest.cc
@@ -0,0 +1,41 @@
+// Copyright 2016 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "mojo/edk/platform/thread_utils.h"
+
+#include "mojo/edk/system/test/stopwatch.h"
+#include "mojo/edk/system/test/timeouts.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+using mojo::system::test::EpsilonTimeout;
+using mojo::system::test::Stopwatch;
+
+namespace mojo {
+namespace platform {
+namespace {
+
+TEST(ThreadUtils, ThreadYield) {
+ // It's pretty hard to test yield, other than maybe statistically (but tough
+ // even then, since it'd be dependent on the number of cores). So just check
+ // that it doesn't crash.
+ ThreadYield();
+}
+
+TEST(ThreadUtils, ThreadSleep) {
+ Stopwatch stopwatch;
+
+ stopwatch.Start();
+ ThreadSleep(0ULL);
+ EXPECT_LT(stopwatch.Elapsed(), EpsilonTimeout());
+
+ stopwatch.Start();
+ ThreadSleep(2 * EpsilonTimeout());
+ MojoDeadline elapsed = stopwatch.Elapsed();
+ EXPECT_GT(elapsed, EpsilonTimeout());
+ EXPECT_LT(elapsed, 3 * EpsilonTimeout());
+}
+
+} // namespace
+} // namespace platform
+} // namespace mojo
diff --git a/mojo/edk/system/awakable_list_unittest.cc b/mojo/edk/system/awakable_list_unittest.cc
index c2a1fb1..d698b9b 100644
--- a/mojo/edk/system/awakable_list_unittest.cc
+++ b/mojo/edk/system/awakable_list_unittest.cc
@@ -9,13 +9,15 @@
#include "mojo/edk/system/awakable_list.h"
+#include "mojo/edk/platform/thread_utils.h"
#include "mojo/edk/system/handle_signals_state.h"
-#include "mojo/edk/system/test/sleep.h"
#include "mojo/edk/system/test/timeouts.h"
#include "mojo/edk/system/waiter.h"
#include "mojo/edk/system/waiter_test_utils.h"
#include "testing/gtest/include/gtest/gtest.h"
+using mojo::platform::ThreadSleep;
+
namespace mojo {
namespace system {
namespace {
@@ -54,7 +56,7 @@
test::SimpleWaiterThread thread(&result, &context);
awakable_list.Add(thread.waiter(), MOJO_HANDLE_SIGNAL_READABLE, 3);
thread.Start();
- test::Sleep(2 * test::EpsilonTimeout());
+ ThreadSleep(2 * test::EpsilonTimeout());
awakable_list.CancelAll();
} // Join |thread|.
EXPECT_EQ(MOJO_RESULT_CANCELLED, result);
@@ -101,7 +103,7 @@
test::SimpleWaiterThread thread(&result, &context);
awakable_list.Add(thread.waiter(), MOJO_HANDLE_SIGNAL_READABLE, 3);
thread.Start();
- test::Sleep(2 * test::EpsilonTimeout());
+ ThreadSleep(2 * test::EpsilonTimeout());
awakable_list.AwakeForStateChange(HandleSignalsState(
MOJO_HANDLE_SIGNAL_READABLE,
MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE));
@@ -147,7 +149,7 @@
test::SimpleWaiterThread thread(&result, &context);
awakable_list.Add(thread.waiter(), MOJO_HANDLE_SIGNAL_READABLE, 3);
thread.Start();
- test::Sleep(2 * test::EpsilonTimeout());
+ ThreadSleep(2 * test::EpsilonTimeout());
awakable_list.AwakeForStateChange(HandleSignalsState(
MOJO_HANDLE_SIGNAL_NONE, MOJO_HANDLE_SIGNAL_WRITABLE));
awakable_list.Remove(thread.waiter());
@@ -177,7 +179,7 @@
test::SimpleWaiterThread thread2(&result2, &context2);
awakable_list.Add(thread2.waiter(), MOJO_HANDLE_SIGNAL_WRITABLE, 2);
thread2.Start();
- test::Sleep(2 * test::EpsilonTimeout());
+ ThreadSleep(2 * test::EpsilonTimeout());
awakable_list.CancelAll();
} // Join threads.
EXPECT_EQ(MOJO_RESULT_CANCELLED, result1);
@@ -194,7 +196,7 @@
test::SimpleWaiterThread thread2(&result2, &context2);
awakable_list.Add(thread2.waiter(), MOJO_HANDLE_SIGNAL_WRITABLE, 4);
thread2.Start();
- test::Sleep(2 * test::EpsilonTimeout());
+ ThreadSleep(2 * test::EpsilonTimeout());
awakable_list.AwakeForStateChange(HandleSignalsState(
MOJO_HANDLE_SIGNAL_READABLE,
MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE));
@@ -215,7 +217,7 @@
test::SimpleWaiterThread thread2(&result2, &context2);
awakable_list.Add(thread2.waiter(), MOJO_HANDLE_SIGNAL_WRITABLE, 6);
thread2.Start();
- test::Sleep(2 * test::EpsilonTimeout());
+ ThreadSleep(2 * test::EpsilonTimeout());
awakable_list.AwakeForStateChange(HandleSignalsState(
MOJO_HANDLE_SIGNAL_NONE, MOJO_HANDLE_SIGNAL_READABLE));
awakable_list.Remove(thread2.waiter());
@@ -233,7 +235,7 @@
awakable_list.Add(thread1.waiter(), MOJO_HANDLE_SIGNAL_READABLE, 7);
thread1.Start();
- test::Sleep(1 * test::EpsilonTimeout());
+ ThreadSleep(1 * test::EpsilonTimeout());
// Should do nothing.
awakable_list.AwakeForStateChange(HandleSignalsState(
@@ -244,7 +246,7 @@
awakable_list.Add(thread2.waiter(), MOJO_HANDLE_SIGNAL_WRITABLE, 8);
thread2.Start();
- test::Sleep(1 * test::EpsilonTimeout());
+ ThreadSleep(1 * test::EpsilonTimeout());
// Awake #1.
awakable_list.AwakeForStateChange(HandleSignalsState(
@@ -252,7 +254,7 @@
MOJO_HANDLE_SIGNAL_READABLE | MOJO_HANDLE_SIGNAL_WRITABLE));
awakable_list.Remove(thread1.waiter());
- test::Sleep(1 * test::EpsilonTimeout());
+ ThreadSleep(1 * test::EpsilonTimeout());
test::SimpleWaiterThread thread3(&result3, &context3);
awakable_list.Add(thread3.waiter(), MOJO_HANDLE_SIGNAL_WRITABLE, 9);
@@ -262,7 +264,7 @@
awakable_list.Add(thread4.waiter(), MOJO_HANDLE_SIGNAL_READABLE, 10);
thread4.Start();
- test::Sleep(1 * test::EpsilonTimeout());
+ ThreadSleep(1 * test::EpsilonTimeout());
// Awake #2 and #3 for unsatisfiability.
awakable_list.AwakeForStateChange(HandleSignalsState(
diff --git a/mojo/edk/system/channel_endpoint.cc b/mojo/edk/system/channel_endpoint.cc
index 8d8ecc1..6de03d3 100644
--- a/mojo/edk/system/channel_endpoint.cc
+++ b/mojo/edk/system/channel_endpoint.cc
@@ -7,11 +7,12 @@
#include <utility>
#include "base/logging.h"
-#include "base/threading/platform_thread.h"
+#include "mojo/edk/platform/thread_utils.h"
#include "mojo/edk/system/channel.h"
#include "mojo/edk/system/channel_endpoint_client.h"
#include "mojo/public/cpp/system/macros.h"
+using mojo::platform::ThreadYield;
using mojo::util::MutexLocker;
using mojo::util::RefPtr;
@@ -211,7 +212,7 @@
break;
}
- base::PlatformThread::YieldCurrentThread();
+ ThreadYield();
}
}
diff --git a/mojo/edk/system/core_unittest.cc b/mojo/edk/system/core_unittest.cc
index 18f3fda..268aadb 100644
--- a/mojo/edk/system/core_unittest.cc
+++ b/mojo/edk/system/core_unittest.cc
@@ -8,11 +8,14 @@
#include <limits>
+#include "mojo/edk/platform/thread_utils.h"
#include "mojo/edk/system/awakable.h"
#include "mojo/edk/system/core_test_base.h"
-#include "mojo/edk/system/test/sleep.h"
+#include "mojo/edk/system/test/timeouts.h"
#include "mojo/public/cpp/system/macros.h"
+using mojo::platform::ThreadSleep;
+
namespace mojo {
namespace system {
namespace {
@@ -29,7 +32,7 @@
const MojoTimeTicks start = core()->GetTimeTicksNow();
EXPECT_NE(static_cast<MojoTimeTicks>(0), start)
<< "GetTimeTicksNow should return nonzero value";
- test::SleepMilliseconds(15u);
+ ThreadSleep(test::DeadlineFromMilliseconds(15u));
const MojoTimeTicks finish = core()->GetTimeTicksNow();
// Allow for some fuzz in sleep.
EXPECT_GE((finish - start), static_cast<MojoTimeTicks>(8000))
diff --git a/mojo/edk/system/data_pipe_impl_unittest.cc b/mojo/edk/system/data_pipe_impl_unittest.cc
index bee13f7..47b2703 100644
--- a/mojo/edk/system/data_pipe_impl_unittest.cc
+++ b/mojo/edk/system/data_pipe_impl_unittest.cc
@@ -15,6 +15,7 @@
#include "base/logging.h"
#include "mojo/edk/embedder/platform_channel_pair.h"
#include "mojo/edk/embedder/simple_platform_support.h"
+#include "mojo/edk/platform/thread_utils.h"
#include "mojo/edk/system/channel.h"
#include "mojo/edk/system/channel_endpoint.h"
#include "mojo/edk/system/data_pipe.h"
@@ -23,7 +24,6 @@
#include "mojo/edk/system/memory.h"
#include "mojo/edk/system/message_pipe.h"
#include "mojo/edk/system/raw_channel.h"
-#include "mojo/edk/system/test/sleep.h"
#include "mojo/edk/system/test/test_io_thread.h"
#include "mojo/edk/system/test/timeouts.h"
#include "mojo/edk/system/waiter.h"
@@ -31,6 +31,7 @@
#include "mojo/public/cpp/system/macros.h"
#include "testing/gtest/include/gtest/gtest.h"
+using mojo::platform::ThreadSleep;
using mojo::util::MakeRefCounted;
using mojo::util::RefPtr;
@@ -1547,7 +1548,7 @@
if (num_bytes >= 10u * sizeof(int32_t))
break;
- test::Sleep(test::EpsilonTimeout());
+ ThreadSleep(test::EpsilonTimeout());
}
EXPECT_EQ(10u * sizeof(int32_t), num_bytes);
@@ -1734,7 +1735,7 @@
EXPECT_EQ(MOJO_RESULT_OUT_OF_RANGE, result);
}
- test::Sleep(test::EpsilonTimeout());
+ ThreadSleep(test::EpsilonTimeout());
}
EXPECT_EQ(90u, total_num_bytes);
@@ -1747,7 +1748,7 @@
if (num_bytes >= 100u)
break;
- test::Sleep(test::EpsilonTimeout());
+ ThreadSleep(test::EpsilonTimeout());
}
EXPECT_EQ(100u, num_bytes);
@@ -1825,7 +1826,7 @@
if (num_bytes >= 2u * kTestDataSize)
break;
- test::Sleep(test::EpsilonTimeout());
+ ThreadSleep(test::EpsilonTimeout());
}
EXPECT_EQ(2u * kTestDataSize, num_bytes);
@@ -2309,7 +2310,7 @@
// Wait a bit, to make sure that if a signal were (incorrectly) sent, it'd
// have time to propagate.
- test::Sleep(test::EpsilonTimeout());
+ ThreadSleep(test::EpsilonTimeout());
// Still no data.
num_bytes = 1000u;
@@ -2331,7 +2332,7 @@
EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, this->ProducerEndWriteData(0u));
// Wait a bit (as above).
- test::Sleep(test::EpsilonTimeout());
+ ThreadSleep(test::EpsilonTimeout());
// Still no data.
num_bytes = 1000u;
@@ -2353,7 +2354,7 @@
EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, this->ProducerEndWriteData(0u));
// Wait a bit (as above).
- test::Sleep(test::EpsilonTimeout());
+ ThreadSleep(test::EpsilonTimeout());
// Still no data.
num_bytes = 1000u;
@@ -2469,7 +2470,7 @@
if (num_bytes >= kTestDataSize)
break;
- test::Sleep(test::EpsilonTimeout());
+ ThreadSleep(test::EpsilonTimeout());
}
EXPECT_EQ(kTestDataSize, num_bytes);
@@ -2490,7 +2491,7 @@
// |ConsumerEndReadData()| below) we want |producer_open()| to be false but
// the call to |channel_endpoint_->EnqueueMessage()| to fail. (This race can
// occur without the sleep, but is much less likely.)
- test::Sleep(10u);
+ ThreadSleep(10u);
EXPECT_EQ(MOJO_RESULT_OK, this->ConsumerEndReadData(num_bytes));
diff --git a/mojo/edk/system/message_pipe_dispatcher_unittest.cc b/mojo/edk/system/message_pipe_dispatcher_unittest.cc
index 168ca5d..1a4d6fe 100644
--- a/mojo/edk/system/message_pipe_dispatcher_unittest.cc
+++ b/mojo/edk/system/message_pipe_dispatcher_unittest.cc
@@ -16,10 +16,10 @@
#include <utility>
#include <vector>
+#include "mojo/edk/platform/thread_utils.h"
#include "mojo/edk/system/message_pipe.h"
#include "mojo/edk/system/test/random.h"
#include "mojo/edk/system/test/simple_test_thread.h"
-#include "mojo/edk/system/test/sleep.h"
#include "mojo/edk/system/test/stopwatch.h"
#include "mojo/edk/system/test/timeouts.h"
#include "mojo/edk/system/waiter.h"
@@ -29,6 +29,7 @@
#include "mojo/public/cpp/system/macros.h"
#include "testing/gtest/include/gtest/gtest.h"
+using mojo::platform::ThreadSleep;
using mojo::util::MakeUnique;
using mojo::util::RefPtr;
@@ -377,7 +378,7 @@
&context, &hss);
stopwatch.Start();
thread.Start();
- test::Sleep(2 * test::EpsilonTimeout());
+ ThreadSleep(2 * test::EpsilonTimeout());
// Wake it up by writing to |d0|.
buffer[0] = 123456789;
EXPECT_EQ(MOJO_RESULT_OK,
@@ -427,7 +428,7 @@
&context, &hss);
stopwatch.Start();
thread.Start();
- test::Sleep(2 * test::EpsilonTimeout());
+ ThreadSleep(2 * test::EpsilonTimeout());
EXPECT_EQ(MOJO_RESULT_OK, d0->Close());
} // Joins the thread.
elapsed = stopwatch.Elapsed();
@@ -461,7 +462,7 @@
&context, &hss);
stopwatch.Start();
thread.Start();
- test::Sleep(2 * test::EpsilonTimeout());
+ ThreadSleep(2 * test::EpsilonTimeout());
EXPECT_EQ(MOJO_RESULT_OK, d1->Close());
} // Joins the thread.
elapsed = stopwatch.Elapsed();
diff --git a/mojo/edk/system/message_pipe_test_utils.cc b/mojo/edk/system/message_pipe_test_utils.cc
index c36dd6e..8fded8c 100644
--- a/mojo/edk/system/message_pipe_test_utils.cc
+++ b/mojo/edk/system/message_pipe_test_utils.cc
@@ -6,14 +6,15 @@
#include <utility>
+#include "mojo/edk/platform/thread_utils.h"
#include "mojo/edk/system/channel.h"
#include "mojo/edk/system/channel_endpoint.h"
#include "mojo/edk/system/message_pipe.h"
-#include "mojo/edk/system/test/sleep.h"
#include "mojo/edk/system/test/timeouts.h"
#include "mojo/edk/system/waiter.h"
using mojo::platform::ScopedPlatformHandle;
+using mojo::platform::ThreadSleep;
using mojo::util::MakeRefCounted;
using mojo::util::RefPtr;
@@ -66,7 +67,7 @@
// TODO(vtl): Remove this once |Channel| has a
// |FlushWriteBufferAndShutdown()| (or whatever).
while (!channel_->IsWriteBufferEmpty())
- test::Sleep(test::EpsilonTimeout());
+ ThreadSleep(test::EpsilonTimeout());
test_io_thread_.PostTaskAndWait([this] {
channel_->Shutdown();
diff --git a/mojo/edk/system/raw_channel_unittest.cc b/mojo/edk/system/raw_channel_unittest.cc
index 26510e5..01f8b0c 100644
--- a/mojo/edk/system/raw_channel_unittest.cc
+++ b/mojo/edk/system/raw_channel_unittest.cc
@@ -15,12 +15,13 @@
#include "mojo/edk/embedder/platform_channel_pair.h"
#include "mojo/edk/platform/platform_handle.h"
#include "mojo/edk/platform/scoped_platform_handle.h"
+#include "mojo/edk/platform/thread_utils.h"
#include "mojo/edk/system/message_in_transit.h"
#include "mojo/edk/system/test/random.h"
#include "mojo/edk/system/test/scoped_test_dir.h"
#include "mojo/edk/system/test/simple_test_thread.h"
-#include "mojo/edk/system/test/sleep.h"
#include "mojo/edk/system/test/test_io_thread.h"
+#include "mojo/edk/system/test/timeouts.h"
#include "mojo/edk/system/transport_data.h"
#include "mojo/edk/test/test_utils.h"
#include "mojo/edk/util/make_unique.h"
@@ -32,6 +33,7 @@
using mojo::platform::PlatformHandle;
using mojo::platform::ScopedPlatformHandle;
+using mojo::platform::ThreadSleep;
using mojo::util::AutoResetWaitableEvent;
using mojo::util::MakeUnique;
using mojo::util::Mutex;
@@ -173,7 +175,7 @@
if (static_cast<size_t>(read_size) < sizeof(buffer)) {
i++;
- test::SleepMilliseconds(kMessageReaderSleepMs);
+ ThreadSleep(test::DeadlineFromMilliseconds(kMessageReaderSleepMs));
}
}
@@ -400,7 +402,7 @@
// Sleep a bit, to let any extraneous reads be processed. (There shouldn't be
// any, but we want to know about them.)
- test::SleepMilliseconds(100u);
+ ThreadSleep(test::DeadlineFromMilliseconds(100u));
// Wait for reading to finish.
reader_delegate.Wait();
@@ -488,7 +490,7 @@
// Sleep a bit, to make sure we don't get another |OnError()|
// notification. (If we actually get another one, |OnError()| crashes.)
- test::SleepMilliseconds(20u);
+ ThreadSleep(test::DeadlineFromMilliseconds(20u));
io_thread()->PostTaskAndWait([&rc]() { rc->Shutdown(); });
}
diff --git a/mojo/edk/system/remote_message_pipe_unittest.cc b/mojo/edk/system/remote_message_pipe_unittest.cc
index 0963c35..25097e5 100644
--- a/mojo/edk/system/remote_message_pipe_unittest.cc
+++ b/mojo/edk/system/remote_message_pipe_unittest.cc
@@ -15,6 +15,7 @@
#include "mojo/edk/embedder/platform_shared_buffer.h"
#include "mojo/edk/embedder/simple_platform_support.h"
#include "mojo/edk/platform/scoped_platform_handle.h"
+#include "mojo/edk/platform/thread_utils.h"
#include "mojo/edk/system/channel.h"
#include "mojo/edk/system/channel_endpoint.h"
#include "mojo/edk/system/channel_endpoint_id.h"
@@ -25,7 +26,6 @@
#include "mojo/edk/system/raw_channel.h"
#include "mojo/edk/system/shared_buffer_dispatcher.h"
#include "mojo/edk/system/test/scoped_test_dir.h"
-#include "mojo/edk/system/test/sleep.h"
#include "mojo/edk/system/test/test_io_thread.h"
#include "mojo/edk/system/test/timeouts.h"
#include "mojo/edk/system/waiter.h"
@@ -36,6 +36,7 @@
#include "testing/gtest/include/gtest/gtest.h"
using mojo::platform::ScopedPlatformHandle;
+using mojo::platform::ThreadSleep;
using mojo::util::MakeRefCounted;
using mojo::util::RefPtr;
@@ -1125,18 +1126,18 @@
BootstrapChannelEndpointNoWait(1, std::move(ep1));
if (i & 1u) {
- io_thread()->PostTask([delay]() { test::Sleep(delay); });
+ io_thread()->PostTask([delay]() { ThreadSleep(delay); });
}
if (i & 2u)
- test::Sleep(delay);
+ ThreadSleep(delay);
mp0->Close(0);
if (i & 4u) {
- io_thread()->PostTask([delay]() { test::Sleep(delay); });
+ io_thread()->PostTask([delay]() { ThreadSleep(delay); });
}
if (i & 8u)
- test::Sleep(delay);
+ ThreadSleep(delay);
mp1->Close(1);
diff --git a/mojo/edk/system/simple_dispatcher_unittest.cc b/mojo/edk/system/simple_dispatcher_unittest.cc
index 305dcde..ae84b52 100644
--- a/mojo/edk/system/simple_dispatcher_unittest.cc
+++ b/mojo/edk/system/simple_dispatcher_unittest.cc
@@ -13,7 +13,7 @@
#include <vector>
#include "base/logging.h"
-#include "mojo/edk/system/test/sleep.h"
+#include "mojo/edk/platform/thread_utils.h"
#include "mojo/edk/system/test/stopwatch.h"
#include "mojo/edk/system/test/timeouts.h"
#include "mojo/edk/system/waiter.h"
@@ -24,6 +24,7 @@
#include "mojo/public/cpp/system/macros.h"
#include "testing/gtest/include/gtest/gtest.h"
+using mojo::platform::ThreadSleep;
using mojo::util::MakeRefCounted;
using mojo::util::MakeUnique;
using mojo::util::MutexLocker;
@@ -364,7 +365,7 @@
&context, &hss);
stopwatch.Start();
thread.Start();
- test::Sleep(2 * test::EpsilonTimeout());
+ ThreadSleep(2 * test::EpsilonTimeout());
d->SetSatisfiedSignals(MOJO_HANDLE_SIGNAL_READABLE);
} // Joins the thread.
EXPECT_EQ(MOJO_RESULT_OK, d->Close());
@@ -388,7 +389,7 @@
&context, &hss);
stopwatch.Start();
thread.Start();
- test::Sleep(2 * test::EpsilonTimeout());
+ ThreadSleep(2 * test::EpsilonTimeout());
d->SetSatisfiableSignals(MOJO_HANDLE_SIGNAL_NONE);
} // Joins the thread.
EXPECT_EQ(MOJO_RESULT_OK, d->Close());
@@ -410,7 +411,7 @@
&context, &hss);
stopwatch.Start();
thread.Start();
- test::Sleep(2 * test::EpsilonTimeout());
+ ThreadSleep(2 * test::EpsilonTimeout());
EXPECT_EQ(MOJO_RESULT_OK, d->Close());
} // Joins the thread.
elapsed = stopwatch.Elapsed();
@@ -431,7 +432,7 @@
&result, &context, &hss);
stopwatch.Start();
thread.Start();
- test::Sleep(1 * test::EpsilonTimeout());
+ ThreadSleep(1 * test::EpsilonTimeout());
// Not what we're waiting for.
d->SetSatisfiedSignals(MOJO_HANDLE_SIGNAL_WRITABLE);
} // Joins the thread (after its wait times out).
@@ -466,7 +467,7 @@
&did_wait[i], &result[i], &context[i], &hss[i]));
threads.back()->Start();
}
- test::Sleep(2 * test::EpsilonTimeout());
+ ThreadSleep(2 * test::EpsilonTimeout());
d->SetSatisfiedSignals(MOJO_HANDLE_SIGNAL_READABLE);
EXPECT_EQ(MOJO_RESULT_OK, d->Close());
} // Joins the threads.
@@ -495,7 +496,7 @@
&did_wait[i], &result[i], &context[i], &hss[i]));
threads.back()->Start();
}
- test::Sleep(2 * test::EpsilonTimeout());
+ ThreadSleep(2 * test::EpsilonTimeout());
d->SetSatisfiedSignals(MOJO_HANDLE_SIGNAL_READABLE);
// This will wake up the ones waiting to write.
EXPECT_EQ(MOJO_RESULT_OK, d->Close());
@@ -532,9 +533,9 @@
&did_wait[i], &result[i], &context[i], &hss[i]));
threads.back()->Start();
}
- test::Sleep(1 * test::EpsilonTimeout());
+ ThreadSleep(1 * test::EpsilonTimeout());
d->SetSatisfiableSignals(MOJO_HANDLE_SIGNAL_READABLE);
- test::Sleep(1 * test::EpsilonTimeout());
+ ThreadSleep(1 * test::EpsilonTimeout());
d->SetSatisfiedSignals(MOJO_HANDLE_SIGNAL_READABLE);
EXPECT_EQ(MOJO_RESULT_OK, d->Close());
} // Joins the threads.
@@ -570,7 +571,7 @@
&did_wait[i], &result[i], &context[i], &hss[i]));
threads.back()->Start();
}
- test::Sleep(2 * test::EpsilonTimeout());
+ ThreadSleep(2 * test::EpsilonTimeout());
d->SetSatisfiedSignals(MOJO_HANDLE_SIGNAL_READABLE);
// All those waiting for writable should have timed out.
EXPECT_EQ(MOJO_RESULT_OK, d->Close());
diff --git a/mojo/edk/system/test/BUILD.gn b/mojo/edk/system/test/BUILD.gn
index f90b4dc..69acdf1 100644
--- a/mojo/edk/system/test/BUILD.gn
+++ b/mojo/edk/system/test/BUILD.gn
@@ -16,8 +16,6 @@
"scoped_test_dir.h",
"simple_test_thread.cc",
"simple_test_thread.h",
- "sleep.cc",
- "sleep.h",
"stopwatch.cc",
"stopwatch.h",
"test_command_line.cc",
@@ -95,7 +93,6 @@
mojo_edk_unittests("mojo_edk_system_test_unittests") {
sources = [
"random_unittest.cc",
- "sleep_unittest.cc",
]
deps = [
diff --git a/mojo/edk/system/test/sleep.cc b/mojo/edk/system/test/sleep.cc
deleted file mode 100644
index 45f0587..0000000
--- a/mojo/edk/system/test/sleep.cc
+++ /dev/null
@@ -1,51 +0,0 @@
-// Copyright 2013 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/edk/system/test/sleep.h"
-
-#include <errno.h>
-#include <stdint.h>
-#include <time.h>
-
-#include <limits>
-
-#include "base/logging.h"
-#include "mojo/edk/system/test/timeouts.h"
-
-namespace mojo {
-namespace system {
-namespace test {
-
-void Sleep(MojoDeadline duration) {
- // TODO(vtl): This doesn't handle |MOJO_DEADLINE_INDEFINITE|. Should it?
- DCHECK_NE(duration, MOJO_DEADLINE_INDEFINITE);
-
- const uint64_t kMicrosecondsPerSecond = 1000000ULL;
- const uint64_t kNanosecondsPerMicrosecond = 1000ULL;
-
- uint64_t sleep_time_seconds = duration / kMicrosecondsPerSecond;
- // |sleep_time.tv_sec| is a |time_t|.
- DCHECK_LE(sleep_time_seconds,
- static_cast<uint64_t>(std::numeric_limits<time_t>::max()));
- uint64_t sleep_time_nanoseconds =
- (duration % kMicrosecondsPerSecond) * kNanosecondsPerMicrosecond;
-
- struct timespec sleep_time;
- sleep_time.tv_sec = static_cast<time_t>(sleep_time_seconds);
- sleep_time.tv_nsec = static_cast<long>(sleep_time_nanoseconds);
-
- struct timespec sleep_time_remaining;
- while (nanosleep(&sleep_time, &sleep_time_remaining) == -1) {
- PCHECK(errno == EINTR) << "nanosleep";
- sleep_time = sleep_time_remaining;
- }
-}
-
-void SleepMilliseconds(unsigned duration_milliseconds) {
- Sleep(DeadlineFromMilliseconds(duration_milliseconds));
-}
-
-} // namespace test
-} // namespace system
-} // namespace mojo
diff --git a/mojo/edk/system/test/sleep.h b/mojo/edk/system/test/sleep.h
deleted file mode 100644
index ff8e4f0..0000000
--- a/mojo/edk/system/test/sleep.h
+++ /dev/null
@@ -1,24 +0,0 @@
-// Copyright 2013 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Function for sleeping in tests. (Please use sparingly.)
-
-#ifndef MOJO_EDK_SYSTEM_TEST_SLEEP_H_
-#define MOJO_EDK_SYSTEM_TEST_SLEEP_H_
-
-#include "mojo/public/c/system/types.h"
-
-namespace mojo {
-namespace system {
-namespace test {
-
-// Sleeps for at least the specified duration.
-void Sleep(MojoDeadline duration);
-void SleepMilliseconds(unsigned duration_milliseconds);
-
-} // namespace test
-} // namespace system
-} // namespace mojo
-
-#endif // MOJO_EDK_SYSTEM_TEST_SLEEP_H_
diff --git a/mojo/edk/system/test/sleep_unittest.cc b/mojo/edk/system/test/sleep_unittest.cc
deleted file mode 100644
index f95cfec..0000000
--- a/mojo/edk/system/test/sleep_unittest.cc
+++ /dev/null
@@ -1,50 +0,0 @@
-// Copyright 2015 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "mojo/edk/system/test/sleep.h"
-
-#include "mojo/edk/system/test/stopwatch.h"
-#include "mojo/edk/system/test/timeouts.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace mojo {
-namespace system {
-namespace test {
-namespace {
-
-TEST(SleepTest, Sleep) {
- Stopwatch stopwatch;
-
- stopwatch.Start();
- Sleep(0ULL);
- EXPECT_LT(stopwatch.Elapsed(), EpsilonTimeout());
-
- stopwatch.Start();
- Sleep(2 * EpsilonTimeout());
- MojoDeadline elapsed = stopwatch.Elapsed();
- EXPECT_GT(elapsed, EpsilonTimeout());
- EXPECT_LT(elapsed, 3 * EpsilonTimeout());
-}
-
-TEST(SleepTest, SleepMilliseconds) {
- Stopwatch stopwatch;
-
- stopwatch.Start();
- SleepMilliseconds(0U);
- EXPECT_LT(stopwatch.Elapsed(), EpsilonTimeout());
-
- const MojoDeadline kMillisecondsPerMicrosecond = 1000ULL;
- unsigned epsilon_ms =
- static_cast<unsigned>(EpsilonTimeout() / kMillisecondsPerMicrosecond);
- stopwatch.Start();
- SleepMilliseconds(2 * epsilon_ms);
- MojoDeadline elapsed = stopwatch.Elapsed();
- EXPECT_GT(elapsed, EpsilonTimeout());
- EXPECT_LT(elapsed, 3 * EpsilonTimeout());
-}
-
-} // namespace
-} // namespace test
-} // namespace system
-} // namespace mojo
diff --git a/mojo/edk/system/waiter_unittest.cc b/mojo/edk/system/waiter_unittest.cc
index 9a344f5..c5c10d9 100644
--- a/mojo/edk/system/waiter_unittest.cc
+++ b/mojo/edk/system/waiter_unittest.cc
@@ -11,14 +11,15 @@
#include <stdint.h>
+#include "mojo/edk/platform/thread_utils.h"
#include "mojo/edk/system/test/simple_test_thread.h"
-#include "mojo/edk/system/test/sleep.h"
#include "mojo/edk/system/test/stopwatch.h"
#include "mojo/edk/system/test/timeouts.h"
#include "mojo/edk/util/mutex.h"
#include "mojo/public/cpp/system/macros.h"
#include "testing/gtest/include/gtest/gtest.h"
+using mojo::platform::ThreadSleep;
using mojo::util::Mutex;
using mojo::util::MutexLocker;
@@ -54,7 +55,7 @@
}
}
- test::SleepMilliseconds(kPollTimeMs);
+ ThreadSleep(test::DeadlineFromMilliseconds(kPollTimeMs));
}
}
@@ -125,7 +126,7 @@
{
WaitingThread thread(10 * test::EpsilonTimeout());
thread.Start();
- test::Sleep(2 * test::EpsilonTimeout());
+ ThreadSleep(2 * test::EpsilonTimeout());
thread.waiter()->Awake(1, 3);
thread.WaitUntilDone(&result, &context, &elapsed);
EXPECT_EQ(1u, result);
@@ -138,7 +139,7 @@
{
WaitingThread thread(10 * test::EpsilonTimeout());
thread.Start();
- test::Sleep(5 * test::EpsilonTimeout());
+ ThreadSleep(5 * test::EpsilonTimeout());
thread.waiter()->Awake(2, 4);
thread.WaitUntilDone(&result, &context, &elapsed);
EXPECT_EQ(2u, result);
@@ -186,7 +187,7 @@
{
WaitingThread thread(MOJO_DEADLINE_INDEFINITE);
thread.Start();
- test::Sleep(2 * test::EpsilonTimeout());
+ ThreadSleep(2 * test::EpsilonTimeout());
thread.waiter()->Awake(1, 7);
thread.WaitUntilDone(&result, &context, &elapsed);
EXPECT_EQ(1u, result);
@@ -199,7 +200,7 @@
{
WaitingThread thread(MOJO_DEADLINE_INDEFINITE);
thread.Start();
- test::Sleep(5 * test::EpsilonTimeout());
+ ThreadSleep(5 * test::EpsilonTimeout());
thread.waiter()->Awake(2, 8);
thread.WaitUntilDone(&result, &context, &elapsed);
EXPECT_EQ(2u, result);
@@ -274,7 +275,7 @@
WaitingThread thread(MOJO_DEADLINE_INDEFINITE);
thread.Start();
thread.waiter()->Awake(10, 5);
- test::Sleep(2 * test::EpsilonTimeout());
+ ThreadSleep(2 * test::EpsilonTimeout());
thread.waiter()->Awake(20, 6);
thread.WaitUntilDone(&result, &context, &elapsed);
EXPECT_EQ(10u, result);
@@ -285,9 +286,9 @@
{
WaitingThread thread(10 * test::EpsilonTimeout());
thread.Start();
- test::Sleep(1 * test::EpsilonTimeout());
+ ThreadSleep(1 * test::EpsilonTimeout());
thread.waiter()->Awake(MOJO_RESULT_FAILED_PRECONDITION, 7);
- test::Sleep(2 * test::EpsilonTimeout());
+ ThreadSleep(2 * test::EpsilonTimeout());
thread.waiter()->Awake(MOJO_RESULT_OK, 8);
thread.WaitUntilDone(&result, &context, &elapsed);
EXPECT_EQ(MOJO_RESULT_FAILED_PRECONDITION, result);
diff --git a/mojo/edk/util/cond_var_unittest.cc b/mojo/edk/util/cond_var_unittest.cc
index ab966f1..4361a73 100644
--- a/mojo/edk/util/cond_var_unittest.cc
+++ b/mojo/edk/util/cond_var_unittest.cc
@@ -11,16 +11,16 @@
#include <type_traits>
#include <vector>
-#include "mojo/edk/system/test/sleep.h"
+#include "mojo/edk/platform/thread_utils.h"
#include "mojo/edk/system/test/stopwatch.h"
#include "mojo/edk/system/test/timeouts.h"
#include "mojo/edk/util/mutex.h"
#include "mojo/public/cpp/system/macros.h"
#include "testing/gtest/include/gtest/gtest.h"
+using mojo::platform::ThreadSleep;
using mojo::system::test::DeadlineFromMilliseconds;
using mojo::system::test::EpsilonTimeout;
-using mojo::system::test::SleepMilliseconds;
using mojo::system::test::Stopwatch;
using mojo::system::test::TinyTimeout;
@@ -30,7 +30,7 @@
// Sleeps for a "very small" amount of time.
void EpsilonRandomSleep() {
- SleepMilliseconds(static_cast<unsigned>(rand()) % 20u);
+ ThreadSleep(DeadlineFromMilliseconds(static_cast<unsigned>(rand()) % 20u));
}
// We'll use |MojoDeadline| with |uint64_t| (for |CondVar::WaitWithTimeout()|'s
diff --git a/mojo/edk/util/mutex_unittest.cc b/mojo/edk/util/mutex_unittest.cc
index 3a69d41..90656ca 100644
--- a/mojo/edk/util/mutex_unittest.cc
+++ b/mojo/edk/util/mutex_unittest.cc
@@ -9,10 +9,12 @@
#include <thread>
#include "build/build_config.h"
-#include "mojo/edk/system/test/sleep.h"
+#include "mojo/edk/platform/thread_utils.h"
+#include "mojo/edk/system/test/timeouts.h"
#include "testing/gtest/include/gtest/gtest.h"
-using mojo::system::test::SleepMilliseconds;
+using mojo::platform::ThreadSleep;
+using mojo::system::test::DeadlineFromMilliseconds;
namespace mojo {
namespace util {
@@ -20,7 +22,7 @@
// Sleeps for a "very small" amount of time.
void EpsilonRandomSleep() {
- SleepMilliseconds(static_cast<unsigned>(rand()) % 20u);
+ ThreadSleep(DeadlineFromMilliseconds(static_cast<unsigned>(rand()) % 20u));
}
// Basic test to make sure that Lock()/Unlock()/TryLock() don't crash ----------
diff --git a/mojo/edk/util/waitable_event_unittest.cc b/mojo/edk/util/waitable_event_unittest.cc
index 4db285c..3777613 100644
--- a/mojo/edk/util/waitable_event_unittest.cc
+++ b/mojo/edk/util/waitable_event_unittest.cc
@@ -12,17 +12,16 @@
#include <type_traits>
#include <vector>
-#include "mojo/edk/system/test/sleep.h"
+#include "mojo/edk/platform/thread_utils.h"
#include "mojo/edk/system/test/stopwatch.h"
#include "mojo/edk/system/test/timeouts.h"
#include "mojo/public/cpp/system/macros.h"
#include "testing/gtest/include/gtest/gtest.h"
+using mojo::platform::ThreadSleep;
using mojo::system::test::ActionTimeout;
using mojo::system::test::DeadlineFromMilliseconds;
using mojo::system::test::EpsilonTimeout;
-using mojo::system::test::Sleep;
-using mojo::system::test::SleepMilliseconds;
using mojo::system::test::Stopwatch;
using mojo::system::test::TinyTimeout;
@@ -32,7 +31,7 @@
// Sleeps for a "very small" amount of time.
void EpsilonRandomSleep() {
- SleepMilliseconds(static_cast<unsigned>(rand()) % 20u);
+ ThreadSleep(DeadlineFromMilliseconds(static_cast<unsigned>(rand()) % 20u));
}
// We'll use |MojoDeadline| with |uint64_t| (for |WaitWithTimeout()|'s timeout
@@ -92,7 +91,7 @@
// Unfortunately, we can't really wait for the threads to be waiting, so we
// just sleep for a bit, and count on them having started and advanced to
// waiting.
- Sleep(2 * TinyTimeout());
+ ThreadSleep(2 * TinyTimeout());
for (size_t j = 0u; j < threads.size(); j++) {
unsigned old_wake_count = wake_count.load();
@@ -103,13 +102,13 @@
// Poll for |wake_count| to change.
while (wake_count.load() == old_wake_count)
- Sleep(EpsilonTimeout());
+ ThreadSleep(EpsilonTimeout());
EXPECT_FALSE(ev.IsSignaledForTest());
// And once it's changed, wait a little longer, to see if any other
// threads are awoken (they shouldn't be).
- Sleep(EpsilonTimeout());
+ ThreadSleep(EpsilonTimeout());
EXPECT_EQ(old_wake_count + 1u, wake_count.load());
@@ -118,7 +117,7 @@
// Having done that, if we signal |ev| now, it should stay signaled.
ev.Signal();
- Sleep(EpsilonTimeout());
+ ThreadSleep(EpsilonTimeout());
EXPECT_TRUE(ev.IsSignaledForTest());
for (auto& thread : threads)
@@ -223,7 +222,7 @@
// Unfortunately, we can't really wait for the threads to be waiting, so we
// just sleep for a bit, and count on them having started and advanced to
// waiting.
- Sleep(2 * TinyTimeout());
+ ThreadSleep(2 * TinyTimeout());
ev.Signal();