summaryrefslogtreecommitdiffstats
path: root/ipc/ipdl/test/cxx/PTestInterruptRaces.ipdl
blob: bf71a251c74b1b2d4565565cd85c5f522e597809 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
namespace mozilla {
namespace _ipdltest {

intr protocol PTestInterruptRaces {
both:
    intr Race() returns (bool hasReply);
    intr StackFrame() returns ();
    intr StackFrame3() returns ();

parent:
    sync StartRace();
    intr Parent();
    sync GetAnsweredParent() returns (bool answeredParent);

child:
    async Start();
    async Wakeup();
    async Wakeup3();
    intr Child();
    async __delete__();

state START:
    send Start goto TEST1;

// First test: race while no other messages are on the Interrupt stack
state TEST1:
    recv StartRace goto RACE1;
state RACE1:
    call Race goto DUMMY1_1;
    answer Race goto DUMMY1_2;
state DUMMY1_1:
    answer Race goto TEST2;
state DUMMY1_2:
    call Race goto TEST2;

// Second test: race while other messages are on the Interrupt stack
state TEST2:
    call StackFrame goto MORESTACK;
state MORESTACK:
    answer StackFrame goto STARTRACE;
state STARTRACE:
    send Wakeup goto RACE2;
state RACE2:
    call Race goto DUMMY2_1;
    answer Race goto DUMMY2_2;
state DUMMY2_1:
    answer Race goto TEST3;
state DUMMY2_2:
    call Race goto TEST3;

// Third test: resolve race using custom policy
state TEST3:
    call StackFrame3 goto MORESTACK3;
state MORESTACK3:
    answer StackFrame3 goto STARTRACE3;
state STARTRACE3:
    send Wakeup3 goto RACE3;
state RACE3:
    call Child goto DUMMY3_1;
    answer Parent goto DUMMY3_2;
state DUMMY3_1:
    // the parent receives this from the child in this state
    recv GetAnsweredParent goto CHECK;
    // this transition is never taken (if the custom race resolution
    // works correctly)
    answer Parent goto CHECK;
state DUMMY3_2:
    call Child goto CHECK;
state CHECK:
    // the child sends this from this state
    recv GetAnsweredParent goto DYING;
    // because of deferred processing, the parent receives the child's
    // message here
    answer Parent goto DYING;


state DYING:
    send __delete__;
};

} // namespace _ipdltest
} // namespace mozilla