зеркало из https://github.com/mozilla/gecko-dev.git
No bug: Test RPC round-trip times and warn before sleep()ing. no r=, test only
This commit is contained in:
Родитель
a0b71135d6
Коммит
45b95bf64a
|
@ -3,12 +3,13 @@ namespace mozilla {
|
|||
namespace _ipdltest {
|
||||
|
||||
|
||||
protocol PTestLatency {
|
||||
rpc protocol PTestLatency {
|
||||
|
||||
child:
|
||||
__delete__();
|
||||
Ping();
|
||||
Ping5();
|
||||
rpc Rpc();
|
||||
|
||||
parent:
|
||||
Pong();
|
||||
|
@ -31,7 +32,7 @@ state PONG:
|
|||
// Trial 2: "overlapped" ping/pong latency
|
||||
state PING5:
|
||||
send Ping5 goto PING4;
|
||||
send __delete__;
|
||||
call Rpc goto RPC;
|
||||
|
||||
state PING4: send Ping5 goto PING3;
|
||||
state PING3: send Ping5 goto PING2;
|
||||
|
@ -43,6 +44,10 @@ state PONG2: recv Pong5 goto PONG3;
|
|||
state PONG3: recv Pong5 goto PONG4;
|
||||
state PONG4: recv Pong5 goto PONG5;
|
||||
state PONG5: recv Pong5 goto PING5;
|
||||
|
||||
state RPC:
|
||||
call Rpc goto RPC;
|
||||
send __delete__;
|
||||
};
|
||||
|
||||
|
||||
|
|
|
@ -16,6 +16,7 @@ TestLatencyParent::TestLatencyParent() :
|
|||
mStart(),
|
||||
mPPTimeTotal(),
|
||||
mPP5TimeTotal(),
|
||||
mRpcTimeTotal(),
|
||||
mPPTrialsToGo(NR_TRIALS),
|
||||
mPP5TrialsToGo(NR_TRIALS),
|
||||
mPongsToGo(0)
|
||||
|
@ -31,12 +32,16 @@ TestLatencyParent::~TestLatencyParent()
|
|||
void
|
||||
TestLatencyParent::Main()
|
||||
{
|
||||
if (TimeDuration::Resolution().ToSeconds() > kTimingResolutionCutoff) {
|
||||
TimeDuration resolution = TimeDuration::Resolution();
|
||||
if (resolution.ToSeconds() > kTimingResolutionCutoff) {
|
||||
puts(" (skipping TestLatency, timing resolution is too poor)");
|
||||
Close();
|
||||
return;
|
||||
}
|
||||
|
||||
printf(" timing resolution: %g seconds\n",
|
||||
resolution.ToSecondsSigDigits());
|
||||
|
||||
if (mozilla::ipc::LoggingEnabled())
|
||||
NS_RUNTIMEABORT("you really don't want to log all IPC messages during this test, trust me");
|
||||
|
||||
|
@ -76,7 +81,7 @@ TestLatencyParent::RecvPong()
|
|||
TimeDuration thisTrial = (TimeStamp::Now() - mStart);
|
||||
mPPTimeTotal += thisTrial;
|
||||
|
||||
if (0 == ((mPPTrialsToGo % 1000)))
|
||||
if (0 == (mPPTrialsToGo % 1000))
|
||||
printf(" PP trial %d: %g\n",
|
||||
mPPTrialsToGo, thisTrial.ToSecondsSigDigits());
|
||||
|
||||
|
@ -97,18 +102,37 @@ TestLatencyParent::RecvPong5()
|
|||
TimeDuration thisTrial = (TimeStamp::Now() - mStart);
|
||||
mPP5TimeTotal += thisTrial;
|
||||
|
||||
if (0 == ((mPP5TrialsToGo % 1000)))
|
||||
if (0 == (mPP5TrialsToGo % 1000))
|
||||
printf(" PP5 trial %d: %g\n",
|
||||
mPP5TrialsToGo, thisTrial.ToSecondsSigDigits());
|
||||
|
||||
if (0 < --mPP5TrialsToGo)
|
||||
Ping5Pong5Trial();
|
||||
else
|
||||
Exit();
|
||||
RpcTrials();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void
|
||||
TestLatencyParent::RpcTrials()
|
||||
{
|
||||
for (int i = 0; i < NR_TRIALS; ++i) {
|
||||
TimeStamp start = TimeStamp::Now();
|
||||
|
||||
if (!CallRpc())
|
||||
fail("can't call Rpc()");
|
||||
|
||||
TimeDuration thisTrial = (TimeStamp::Now() - start);
|
||||
|
||||
if (0 == (i % 1000))
|
||||
printf(" Rpc trial %d: %g\n", i, thisTrial.ToSecondsSigDigits());
|
||||
|
||||
mRpcTimeTotal += thisTrial;
|
||||
}
|
||||
|
||||
Exit();
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// child
|
||||
|
@ -137,6 +161,11 @@ TestLatencyChild::RecvPing5()
|
|||
return true;
|
||||
}
|
||||
|
||||
bool
|
||||
TestLatencyChild::AnswerRpc()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
} // namespace _ipdltest
|
||||
} // namespace mozilla
|
||||
|
|
|
@ -38,9 +38,12 @@ protected:
|
|||
if (NormalShutdown != why)
|
||||
fail("unexpected destruction!");
|
||||
|
||||
passed("average ping/pong latency: %g sec, average ping5/pong5 latency: %g sec",
|
||||
passed("average ping/pong latency: %g sec, "
|
||||
"average ping5/pong5 latency: %g sec, "
|
||||
"average RPC call/answer: %g sec",
|
||||
mPPTimeTotal.ToSecondsSigDigits() / (double) NR_TRIALS,
|
||||
mPP5TimeTotal.ToSecondsSigDigits() / (double) NR_TRIALS);
|
||||
mPP5TimeTotal.ToSecondsSigDigits() / (double) NR_TRIALS,
|
||||
mRpcTimeTotal.ToSecondsSigDigits() / (double) NR_TRIALS);
|
||||
|
||||
QuitParent();
|
||||
}
|
||||
|
@ -48,11 +51,13 @@ protected:
|
|||
private:
|
||||
void PingPongTrial();
|
||||
void Ping5Pong5Trial();
|
||||
void RpcTrials();
|
||||
void Exit();
|
||||
|
||||
TimeStamp mStart;
|
||||
TimeDuration mPPTimeTotal;
|
||||
TimeDuration mPP5TimeTotal;
|
||||
TimeDuration mRpcTimeTotal;
|
||||
|
||||
int mPPTrialsToGo;
|
||||
int mPP5TrialsToGo;
|
||||
|
@ -74,6 +79,8 @@ protected:
|
|||
virtual bool RecvPing();
|
||||
NS_OVERRIDE
|
||||
virtual bool RecvPing5();
|
||||
NS_OVERRIDE
|
||||
virtual bool AnswerRpc();
|
||||
|
||||
NS_OVERRIDE
|
||||
virtual void ActorDestroy(ActorDestroyReason why)
|
||||
|
|
|
@ -50,6 +50,7 @@ TestSyncWakeupParent::RecvSync1()
|
|||
// NB: can't use PR_Sleep (i.e. Sleep() on windows) because it's
|
||||
// only spec'd to block the current thread, not the current
|
||||
// process. We need the IO thread to sleep as well.
|
||||
puts(" (sleeping for 5 seconds. sorry!)");
|
||||
sleep(5);
|
||||
#endif
|
||||
|
||||
|
@ -65,6 +66,7 @@ TestSyncWakeupParent::RecvSync2()
|
|||
#if defined(OS_POSIX)
|
||||
// see above
|
||||
sleep(5);
|
||||
puts(" (sleeping for 5 seconds. sorry!)");
|
||||
#endif
|
||||
|
||||
return true;
|
||||
|
|
Загрузка…
Ссылка в новой задаче