mirror of
https://gitlab.winehq.org/wine/wine-gecko.git
synced 2024-09-13 09:24:08 -07:00
120 lines
2.4 KiB
C++
120 lines
2.4 KiB
C++
#include "TestRacyRPCReplies.h"
|
|
|
|
#include "IPDLUnitTests.h" // fail etc.
|
|
|
|
namespace mozilla {
|
|
namespace _ipdltest {
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// parent
|
|
|
|
TestRacyRPCRepliesParent::TestRacyRPCRepliesParent() : mReplyNum(0)
|
|
{
|
|
MOZ_COUNT_CTOR(TestRacyRPCRepliesParent);
|
|
}
|
|
|
|
TestRacyRPCRepliesParent::~TestRacyRPCRepliesParent()
|
|
{
|
|
MOZ_COUNT_DTOR(TestRacyRPCRepliesParent);
|
|
}
|
|
|
|
void
|
|
TestRacyRPCRepliesParent::Main()
|
|
{
|
|
int replyNum = -1;
|
|
if (!CallR_(&replyNum))
|
|
fail("calling R()");
|
|
|
|
if (1 != replyNum)
|
|
fail("this should have been the first reply to R()");
|
|
|
|
if (!SendChildTest())
|
|
fail("sending ChildStart");
|
|
}
|
|
|
|
bool
|
|
TestRacyRPCRepliesParent::RecvA_()
|
|
{
|
|
int replyNum = -1;
|
|
// this R() call races with the reply being generated by the other
|
|
// side to the R() call from Main(). This is a pretty nasty edge
|
|
// case for which one could argue we're breaking in-order message
|
|
// delivery, since this side will process the second reply to R()
|
|
// before the first.
|
|
if (!CallR_(&replyNum))
|
|
fail("calling R()");
|
|
|
|
if (2 != replyNum)
|
|
fail("this should have been the second reply to R()");
|
|
|
|
return true;
|
|
}
|
|
|
|
bool
|
|
TestRacyRPCRepliesParent::Answer_R(int* replyNum)
|
|
{
|
|
*replyNum = ++mReplyNum;
|
|
|
|
if (1 == *replyNum)
|
|
if (!Send_A())
|
|
fail("sending _A()");
|
|
|
|
return true;
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// child
|
|
|
|
TestRacyRPCRepliesChild::TestRacyRPCRepliesChild() : mReplyNum(0)
|
|
{
|
|
MOZ_COUNT_CTOR(TestRacyRPCRepliesChild);
|
|
}
|
|
|
|
TestRacyRPCRepliesChild::~TestRacyRPCRepliesChild()
|
|
{
|
|
MOZ_COUNT_DTOR(TestRacyRPCRepliesChild);
|
|
}
|
|
|
|
bool
|
|
TestRacyRPCRepliesChild::AnswerR_(int* replyNum)
|
|
{
|
|
*replyNum = ++mReplyNum;
|
|
|
|
if (1 == *replyNum)
|
|
SendA_();
|
|
|
|
return true;
|
|
}
|
|
|
|
bool
|
|
TestRacyRPCRepliesChild::RecvChildTest()
|
|
{
|
|
int replyNum = -1;
|
|
if (!Call_R(&replyNum))
|
|
fail("calling R()");
|
|
|
|
if (1 != replyNum)
|
|
fail("this should have been the first reply to R()");
|
|
|
|
Close();
|
|
|
|
return true;
|
|
}
|
|
|
|
bool
|
|
TestRacyRPCRepliesChild::Recv_A()
|
|
{
|
|
int replyNum = -1;
|
|
|
|
if (!Call_R(&replyNum))
|
|
fail("calling _R()");
|
|
|
|
if (2 != replyNum)
|
|
fail("this should have been the second reply to R()");
|
|
|
|
return true;
|
|
}
|
|
|
|
} // namespace _ipdltest
|
|
} // namespace mozilla
|