namespace mozilla {
namespace _ipdltest {


intr protocol PTestLatency {

child:
    async __delete__();
    async Ping();
    async Ping5();
    intr Rpc();
    async Spam();
    intr Synchro();
    async CompressedSpam(uint32_t seqno) compress;
    intr Synchro2() returns (uint32_t lastSeqno,
                            uint32_t numMessagesDispatched);

parent:
    async Pong();
    async Pong5();

state START:
    // if the timing resolution is too low, abort the test
    send __delete__;
    // otherwise, kick off the ping/pong trials
    send Ping goto PONG;

    // Trial 1: single ping/pong latency
state PING:
    send Ping goto PONG;
    send Ping5 goto PING4;

state PONG:
    recv Pong goto PING;

    // Trial 2: "overlapped" ping/pong latency
state PING5:
    send Ping5 goto PING4;
    call Rpc goto RPC;

state PING4: send Ping5 goto PING3;
state PING3: send Ping5 goto PING2;
state PING2: send Ping5 goto PING1;
state PING1: send Ping5 goto PONG1;

state PONG1: recv Pong5 goto PONG2;
state PONG2: recv Pong5 goto PONG3;
state PONG3: recv Pong5 goto PONG4;
state PONG4: recv Pong5 goto PONG5;
state PONG5: recv Pong5 goto PING5;

    // Trial 3: lotsa RPC
state RPC:
    call Rpc goto RPC;
    send Spam goto SPAM;

    // Trial 4: lots of sequential asyn messages, which tests pipelining
state SPAM:
    send Spam goto SPAM;
    call Synchro goto COMPRESSED_SPAM;

    // Trial 5: lots of async spam, but compressed to cut down on
    // dispatch overhead
state COMPRESSED_SPAM:          // compressed spam, mmm
    send CompressedSpam goto COMPRESSED_SPAM;
    call Synchro2 goto DONE;

state DONE:
    send __delete__;
};


} // namespace mozilla
} // namespace _ipdltest