blob: f83c49fd110368451ddb464c4ecb43d68b2c6d29 (
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
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
|
#ifndef mozilla__ipdltest_TestInterruptRaces_h
#define mozilla__ipdltest_TestInterruptRaces_h
#include "mozilla/_ipdltest/IPDLUnitTests.h"
#include "mozilla/_ipdltest/PTestInterruptRacesParent.h"
#include "mozilla/_ipdltest/PTestInterruptRacesChild.h"
namespace mozilla {
namespace _ipdltest {
mozilla::ipc::RacyInterruptPolicy
MediateRace(const mozilla::ipc::MessageChannel::MessageInfo& parent,
const mozilla::ipc::MessageChannel::MessageInfo& child);
class TestInterruptRacesParent :
public PTestInterruptRacesParent
{
public:
TestInterruptRacesParent() : mHasReply(false),
mChildHasReply(false),
mAnsweredParent(false)
{ }
virtual ~TestInterruptRacesParent() { }
static bool RunTestInProcesses() { return true; }
static bool RunTestInThreads() { return true; }
void Main();
protected:
virtual bool
RecvStartRace() override;
virtual bool
AnswerRace(bool* hasRace) override;
virtual bool
AnswerStackFrame() override;
virtual bool
AnswerStackFrame3() override;
virtual bool
AnswerParent() override;
virtual bool
RecvGetAnsweredParent(bool* answeredParent) override;
virtual mozilla::ipc::RacyInterruptPolicy
MediateInterruptRace(const MessageInfo& parent,
const MessageInfo& child) override
{
return MediateRace(parent, child);
}
virtual void ActorDestroy(ActorDestroyReason why) override
{
if (NormalShutdown != why)
fail("unexpected destruction!");
if (!(mHasReply && mChildHasReply))
fail("both sides should have replies!");
passed("ok");
QuitParent();
}
private:
void OnRaceTime();
void Test2();
void Test3();
bool mHasReply;
bool mChildHasReply;
bool mAnsweredParent;
};
class TestInterruptRacesChild :
public PTestInterruptRacesChild
{
public:
TestInterruptRacesChild() : mHasReply(false) { }
virtual ~TestInterruptRacesChild() { }
protected:
virtual bool
RecvStart() override;
virtual bool
AnswerRace(bool* hasRace) override;
virtual bool
AnswerStackFrame() override;
virtual bool
AnswerStackFrame3() override;
virtual bool
RecvWakeup() override;
virtual bool
RecvWakeup3() override;
virtual bool
AnswerChild() override;
virtual mozilla::ipc::RacyInterruptPolicy
MediateInterruptRace(const MessageInfo& parent,
const MessageInfo& child) override
{
return MediateRace(parent, child);
}
virtual void ActorDestroy(ActorDestroyReason why) override
{
if (NormalShutdown != why)
fail("unexpected destruction!");
QuitChild();
}
private:
bool mHasReply;
};
} // namespace _ipdltest
} // namespace mozilla
#endif // ifndef mozilla__ipdltest_TestInterruptRaces_h
|