summaryrefslogtreecommitdiffstats
path: root/ipc/ipdl/test/cxx/TestNestedLoops.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'ipc/ipdl/test/cxx/TestNestedLoops.cpp')
-rw-r--r--ipc/ipdl/test/cxx/TestNestedLoops.cpp78
1 files changed, 78 insertions, 0 deletions
diff --git a/ipc/ipdl/test/cxx/TestNestedLoops.cpp b/ipc/ipdl/test/cxx/TestNestedLoops.cpp
new file mode 100644
index 0000000000..3658d7dfb6
--- /dev/null
+++ b/ipc/ipdl/test/cxx/TestNestedLoops.cpp
@@ -0,0 +1,78 @@
+#include "base/basictypes.h"
+
+#include "nsThreadUtils.h"
+
+#include "TestNestedLoops.h"
+
+#include "IPDLUnitTests.h" // fail etc.
+
+namespace mozilla {
+namespace _ipdltest {
+
+//-----------------------------------------------------------------------------
+// parent
+
+TestNestedLoopsParent::TestNestedLoopsParent() : mBreakNestedLoop(false) {
+ MOZ_COUNT_CTOR(TestNestedLoopsParent);
+}
+
+TestNestedLoopsParent::~TestNestedLoopsParent() {
+ MOZ_COUNT_DTOR(TestNestedLoopsParent);
+}
+
+void TestNestedLoopsParent::Main() {
+ if (!SendStart()) fail("sending Start");
+
+ // sigh ... spin for a while to let Nonce arrive
+ puts(" (sleeping to wait for nonce ... sorry)");
+ PR_Sleep(5000);
+
+ // while waiting for the reply to R, we'll receive Nonce
+ if (!CallR()) fail("calling R");
+
+ Close();
+}
+
+mozilla::ipc::IPCResult TestNestedLoopsParent::RecvNonce() {
+ // if we have an OnMaybeDequeueOne waiting for us (we may not, due
+ // to the inherent race condition in this test, then this event
+ // must be ordered after it in the queue
+ MessageLoop::current()->PostTask(NewNonOwningRunnableMethod(
+ "_ipdltest::TestNestedLoopsParent::BreakNestedLoop", this,
+ &TestNestedLoopsParent::BreakNestedLoop));
+
+ // sigh ... spin for a while to let the reply to R arrive
+ puts(" (sleeping to wait for reply to R ... sorry)");
+ PR_Sleep(5000);
+
+ // sigh ... we have no idea when code might do this
+ do {
+ if (!NS_ProcessNextEvent(nullptr, false))
+ fail("expected at least one pending event");
+ } while (!mBreakNestedLoop);
+
+ return IPC_OK();
+}
+
+void TestNestedLoopsParent::BreakNestedLoop() { mBreakNestedLoop = true; }
+
+//-----------------------------------------------------------------------------
+// child
+
+TestNestedLoopsChild::TestNestedLoopsChild() {
+ MOZ_COUNT_CTOR(TestNestedLoopsChild);
+}
+
+TestNestedLoopsChild::~TestNestedLoopsChild() {
+ MOZ_COUNT_DTOR(TestNestedLoopsChild);
+}
+
+mozilla::ipc::IPCResult TestNestedLoopsChild::RecvStart() {
+ if (!SendNonce()) fail("sending Nonce");
+ return IPC_OK();
+}
+
+mozilla::ipc::IPCResult TestNestedLoopsChild::AnswerR() { return IPC_OK(); }
+
+} // namespace _ipdltest
+} // namespace mozilla