summaryrefslogtreecommitdiffstats
path: root/ipc/ipdl/test/cxx/TestRaceDeadlock.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'ipc/ipdl/test/cxx/TestRaceDeadlock.cpp')
-rw-r--r--ipc/ipdl/test/cxx/TestRaceDeadlock.cpp102
1 files changed, 102 insertions, 0 deletions
diff --git a/ipc/ipdl/test/cxx/TestRaceDeadlock.cpp b/ipc/ipdl/test/cxx/TestRaceDeadlock.cpp
new file mode 100644
index 0000000000..76defe97a5
--- /dev/null
+++ b/ipc/ipdl/test/cxx/TestRaceDeadlock.cpp
@@ -0,0 +1,102 @@
+#include "TestRaceDeadlock.h"
+
+#include "IPDLUnitTests.h" // fail etc.
+
+// #define TEST_TIMEOUT 5000
+
+using namespace mozilla::ipc;
+typedef mozilla::ipc::MessageChannel::Message Message;
+typedef mozilla::ipc::MessageChannel::MessageInfo MessageInfo;
+
+namespace mozilla {
+namespace _ipdltest {
+
+static RacyInterruptPolicy MediateRace(const MessageInfo& parent,
+ const MessageInfo& child) {
+ return (PTestRaceDeadlock::Msg_Win__ID == parent.type()) ? RIPParentWins
+ : RIPChildWins;
+}
+
+//-----------------------------------------------------------------------------
+// parent
+
+TestRaceDeadlockParent::TestRaceDeadlockParent() {
+ MOZ_COUNT_CTOR(TestRaceDeadlockParent);
+}
+
+TestRaceDeadlockParent::~TestRaceDeadlockParent() {
+ MOZ_COUNT_DTOR(TestRaceDeadlockParent);
+}
+
+void TestRaceDeadlockParent::Main() {
+ Test1();
+
+ Close();
+}
+
+bool TestRaceDeadlockParent::ShouldContinueFromReplyTimeout() {
+ fail("This test should not hang");
+ GetIPCChannel()->CloseWithTimeout();
+ return false;
+}
+
+void TestRaceDeadlockParent::Test1() {
+#if defined(TEST_TIMEOUT)
+ SetReplyTimeoutMs(TEST_TIMEOUT);
+#endif
+ if (!SendStartRace()) {
+ fail("sending StartRace");
+ }
+ if (!CallRpc()) {
+ fail("calling Rpc");
+ }
+}
+
+mozilla::ipc::IPCResult TestRaceDeadlockParent::AnswerLose() {
+ return IPC_OK();
+}
+
+RacyInterruptPolicy TestRaceDeadlockParent::MediateInterruptRace(
+ const MessageInfo& parent, const MessageInfo& child) {
+ return MediateRace(parent, child);
+}
+
+//-----------------------------------------------------------------------------
+// child
+
+TestRaceDeadlockChild::TestRaceDeadlockChild() {
+ MOZ_COUNT_CTOR(TestRaceDeadlockChild);
+}
+
+TestRaceDeadlockChild::~TestRaceDeadlockChild() {
+ MOZ_COUNT_DTOR(TestRaceDeadlockChild);
+}
+
+mozilla::ipc::IPCResult TestRaceDeadlockParent::RecvStartRace() {
+ if (!CallWin()) {
+ fail("calling Win");
+ }
+ return IPC_OK();
+}
+
+mozilla::ipc::IPCResult TestRaceDeadlockChild::RecvStartRace() {
+ if (!SendStartRace()) {
+ fail("calling SendStartRace");
+ }
+ if (!CallLose()) {
+ fail("calling Lose");
+ }
+ return IPC_OK();
+}
+
+mozilla::ipc::IPCResult TestRaceDeadlockChild::AnswerWin() { return IPC_OK(); }
+
+mozilla::ipc::IPCResult TestRaceDeadlockChild::AnswerRpc() { return IPC_OK(); }
+
+RacyInterruptPolicy TestRaceDeadlockChild::MediateInterruptRace(
+ const MessageInfo& parent, const MessageInfo& child) {
+ return MediateRace(parent, child);
+}
+
+} // namespace _ipdltest
+} // namespace mozilla