mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-09 19:35:51 +00:00
Bug 1261094 - Improve how MessageChannel::mInterruptStack is used in IPC code, r=jld
This commit is contained in:
parent
de41c2626d
commit
a9b65ecfb0
@ -65,8 +65,8 @@ NPRemoteWindow::NPRemoteWindow() :
|
||||
}
|
||||
|
||||
ipc::RacyInterruptPolicy
|
||||
MediateRace(const MessageChannel::Message& parent,
|
||||
const MessageChannel::Message& child)
|
||||
MediateRace(const MessageChannel::MessageInfo& parent,
|
||||
const MessageChannel::MessageInfo& child)
|
||||
{
|
||||
switch (parent.type()) {
|
||||
case PPluginInstance::Msg_Paint__ID:
|
||||
|
@ -45,8 +45,8 @@ enum ScriptableObjectType
|
||||
};
|
||||
|
||||
mozilla::ipc::RacyInterruptPolicy
|
||||
MediateRace(const mozilla::ipc::MessageChannel::Message& parent,
|
||||
const mozilla::ipc::MessageChannel::Message& child);
|
||||
MediateRace(const mozilla::ipc::MessageChannel::MessageInfo& parent,
|
||||
const mozilla::ipc::MessageChannel::MessageInfo& child);
|
||||
|
||||
std::string
|
||||
MungePluginDsoPath(const std::string& path);
|
||||
|
@ -65,7 +65,8 @@ class PluginModuleChild : public PPluginModuleChild
|
||||
typedef mozilla::dom::PCrashReporterChild PCrashReporterChild;
|
||||
protected:
|
||||
virtual mozilla::ipc::RacyInterruptPolicy
|
||||
MediateInterruptRace(const Message& parent, const Message& child) override
|
||||
MediateInterruptRace(const MessageInfo& parent,
|
||||
const MessageInfo& child) override
|
||||
{
|
||||
return MediateRace(parent, child);
|
||||
}
|
||||
|
@ -147,7 +147,8 @@ public:
|
||||
|
||||
protected:
|
||||
virtual mozilla::ipc::RacyInterruptPolicy
|
||||
MediateInterruptRace(const Message& parent, const Message& child) override
|
||||
MediateInterruptRace(const MessageInfo& parent,
|
||||
const MessageInfo& child) override
|
||||
{
|
||||
return MediateRace(parent, child);
|
||||
}
|
||||
|
@ -358,6 +358,21 @@ class Message : public Pickle {
|
||||
|
||||
};
|
||||
|
||||
class MessageInfo {
|
||||
public:
|
||||
typedef uint32_t msgid_t;
|
||||
|
||||
explicit MessageInfo(const Message& aMsg)
|
||||
: mSeqno(aMsg.seqno()), mType(aMsg.type()) {}
|
||||
|
||||
int32_t seqno() const { return mSeqno; }
|
||||
msgid_t type() const { return mType; }
|
||||
|
||||
private:
|
||||
int32_t mSeqno;
|
||||
msgid_t mType;
|
||||
};
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
} // namespace IPC
|
||||
|
@ -1282,7 +1282,7 @@ MessageChannel::Call(Message* aMsg, Message* aReply)
|
||||
msg->set_seqno(NextSeqno());
|
||||
msg->set_interrupt_remote_stack_depth_guess(mRemoteStackDepthGuess);
|
||||
msg->set_interrupt_local_stack_depth(1 + InterruptStackDepth());
|
||||
mInterruptStack.push(*msg);
|
||||
mInterruptStack.push(MessageInfo(*msg));
|
||||
mLink->SendMessage(msg.forget());
|
||||
|
||||
while (true) {
|
||||
@ -1367,7 +1367,7 @@ MessageChannel::Call(Message* aMsg, Message* aReply)
|
||||
// If this is not a reply the call we've initiated, add it to our
|
||||
// out-of-turn replies and keep polling for events.
|
||||
{
|
||||
const Message &outcall = mInterruptStack.top();
|
||||
const MessageInfo &outcall = mInterruptStack.top();
|
||||
|
||||
// Note, In the parent, sequence numbers increase from 0, and
|
||||
// in the child, they decrease from 0.
|
||||
@ -1669,9 +1669,11 @@ MessageChannel::DispatchInterruptMessage(const Message& aMsg, size_t stackDepth)
|
||||
// processing of the other side's in-call.
|
||||
bool defer;
|
||||
const char* winner;
|
||||
const Message& parentMsg = (mSide == ChildSide) ? aMsg : mInterruptStack.top();
|
||||
const Message& childMsg = (mSide == ChildSide) ? mInterruptStack.top() : aMsg;
|
||||
switch (mListener->MediateInterruptRace(parentMsg, childMsg))
|
||||
const MessageInfo parentMsgInfo =
|
||||
(mSide == ChildSide) ? MessageInfo(aMsg) : mInterruptStack.top();
|
||||
const MessageInfo childMsgInfo =
|
||||
(mSide == ChildSide) ? mInterruptStack.top() : MessageInfo(aMsg);
|
||||
switch (mListener->MediateInterruptRace(parentMsgInfo, childMsgInfo))
|
||||
{
|
||||
case RIPChildWins:
|
||||
winner = "child";
|
||||
|
@ -74,6 +74,7 @@ class MessageChannel : HasResultCodes
|
||||
static const int32_t kNoTimeout;
|
||||
|
||||
typedef IPC::Message Message;
|
||||
typedef IPC::MessageInfo MessageInfo;
|
||||
typedef mozilla::ipc::Transport Transport;
|
||||
|
||||
explicit MessageChannel(MessageListener *aListener);
|
||||
@ -639,7 +640,7 @@ class MessageChannel : HasResultCodes
|
||||
// Each stack refers to a different protocol and the stacks are mutually
|
||||
// exclusive: multiple outcalls of the same kind cannot be initiated while
|
||||
// another is active.
|
||||
std::stack<Message> mInterruptStack;
|
||||
std::stack<MessageInfo> mInterruptStack;
|
||||
|
||||
// This is what we think the Interrupt stack depth is on the "other side" of this
|
||||
// Interrupt channel. We maintain this variable so that we can detect racy Interrupt
|
||||
|
@ -62,6 +62,7 @@ class MessageListener
|
||||
public:
|
||||
MOZ_DECLARE_WEAKREFERENCE_TYPENAME(MessageListener)
|
||||
typedef IPC::Message Message;
|
||||
typedef IPC::MessageInfo MessageInfo;
|
||||
|
||||
virtual ~MessageListener() { }
|
||||
|
||||
@ -120,8 +121,8 @@ class MessageListener
|
||||
virtual void OnExitedCall() {
|
||||
NS_RUNTIMEABORT("default impl shouldn't be invoked");
|
||||
}
|
||||
virtual RacyInterruptPolicy MediateInterruptRace(const Message& parent,
|
||||
const Message& child)
|
||||
virtual RacyInterruptPolicy MediateInterruptRace(const MessageInfo& parent,
|
||||
const MessageInfo& child)
|
||||
{
|
||||
return RIPChildWins;
|
||||
}
|
||||
|
@ -16,11 +16,11 @@ namespace mozilla {
|
||||
namespace _ipdltest {
|
||||
|
||||
ipc::RacyInterruptPolicy
|
||||
MediateRace(const MessageChannel::Message& parent,
|
||||
const MessageChannel::Message& child)
|
||||
MediateRace(const MessageChannel::MessageInfo& parent,
|
||||
const MessageChannel::MessageInfo& child)
|
||||
{
|
||||
return (PTestInterruptRaces::Msg_Child__ID == parent.type()) ?
|
||||
ipc::RIPParentWins : ipc::RIPChildWins;
|
||||
ipc::RIPParentWins : ipc::RIPChildWins;
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
|
@ -10,8 +10,8 @@ namespace mozilla {
|
||||
namespace _ipdltest {
|
||||
|
||||
mozilla::ipc::RacyInterruptPolicy
|
||||
MediateRace(const mozilla::ipc::MessageChannel::Message& parent,
|
||||
const mozilla::ipc::MessageChannel::Message& child);
|
||||
MediateRace(const mozilla::ipc::MessageChannel::MessageInfo& parent,
|
||||
const mozilla::ipc::MessageChannel::MessageInfo& child);
|
||||
|
||||
class TestInterruptRacesParent :
|
||||
public PTestInterruptRacesParent
|
||||
@ -48,7 +48,8 @@ protected:
|
||||
RecvGetAnsweredParent(bool* answeredParent) override;
|
||||
|
||||
virtual mozilla::ipc::RacyInterruptPolicy
|
||||
MediateInterruptRace(const Message& parent, const Message& child) override
|
||||
MediateInterruptRace(const MessageInfo& parent,
|
||||
const MessageInfo& child) override
|
||||
{
|
||||
return MediateRace(parent, child);
|
||||
}
|
||||
@ -105,7 +106,8 @@ protected:
|
||||
AnswerChild() override;
|
||||
|
||||
virtual mozilla::ipc::RacyInterruptPolicy
|
||||
MediateInterruptRace(const Message& parent, const Message& child) override
|
||||
MediateInterruptRace(const MessageInfo& parent,
|
||||
const MessageInfo& child) override
|
||||
{
|
||||
return MediateRace(parent, child);
|
||||
}
|
||||
|
@ -11,7 +11,7 @@ namespace mozilla {
|
||||
namespace _ipdltest {
|
||||
|
||||
static RacyInterruptPolicy
|
||||
MediateRace(const Message& parent, const Message& child)
|
||||
MediateRace(const MessageInfo& parent, const MessageInfo& child)
|
||||
{
|
||||
return (PTestRaceDeadlock::Msg_Win__ID == parent.type()) ?
|
||||
RIPParentWins : RIPChildWins;
|
||||
@ -67,8 +67,8 @@ TestRaceDeadlockParent::AnswerLose()
|
||||
}
|
||||
|
||||
RacyInterruptPolicy
|
||||
TestRaceDeadlockParent::MediateInterruptRace(const Message& parent,
|
||||
const Message& child)
|
||||
TestRaceDeadlockParent::MediateInterruptRace(const MessageInfo& parent,
|
||||
const MessageInfo& child)
|
||||
{
|
||||
return MediateRace(parent, child);
|
||||
}
|
||||
@ -120,8 +120,8 @@ TestRaceDeadlockChild::AnswerRpc()
|
||||
}
|
||||
|
||||
RacyInterruptPolicy
|
||||
TestRaceDeadlockChild::MediateInterruptRace(const Message& parent,
|
||||
const Message& child)
|
||||
TestRaceDeadlockChild::MediateInterruptRace(const MessageInfo& parent,
|
||||
const MessageInfo& child)
|
||||
{
|
||||
return MediateRace(parent, child);
|
||||
}
|
||||
|
@ -30,7 +30,8 @@ protected:
|
||||
virtual bool AnswerLose() override;
|
||||
|
||||
virtual mozilla::ipc::RacyInterruptPolicy
|
||||
MediateInterruptRace(const Message& parent, const Message& child) override;
|
||||
MediateInterruptRace(const MessageInfo& parent,
|
||||
const MessageInfo& child) override;
|
||||
|
||||
virtual void ActorDestroy(ActorDestroyReason why) override
|
||||
{
|
||||
@ -57,7 +58,8 @@ protected:
|
||||
virtual bool AnswerRpc() override;
|
||||
|
||||
virtual mozilla::ipc::RacyInterruptPolicy
|
||||
MediateInterruptRace(const Message& parent, const Message& child) override;
|
||||
MediateInterruptRace(const MessageInfo& parent,
|
||||
const MessageInfo& child) override;
|
||||
|
||||
virtual void ActorDestroy(ActorDestroyReason why) override
|
||||
{
|
||||
|
@ -9,7 +9,7 @@ namespace mozilla {
|
||||
namespace _ipdltest {
|
||||
|
||||
static RacyInterruptPolicy
|
||||
MediateRace(const Message& parent, const Message& child)
|
||||
MediateRace(const MessageInfo& parent, const MessageInfo& child)
|
||||
{
|
||||
return (PTestRaceDeferral::Msg_Win__ID == parent.type()) ?
|
||||
RIPParentWins : RIPChildWins;
|
||||
@ -67,8 +67,8 @@ TestRaceDeferralParent::AnswerLose()
|
||||
}
|
||||
|
||||
RacyInterruptPolicy
|
||||
TestRaceDeferralParent::MediateInterruptRace(const Message& parent,
|
||||
const Message& child)
|
||||
TestRaceDeferralParent::MediateInterruptRace(const MessageInfo& parent,
|
||||
const MessageInfo& child)
|
||||
{
|
||||
return MediateRace(parent, child);
|
||||
}
|
||||
@ -107,8 +107,8 @@ TestRaceDeferralChild::AnswerRpc()
|
||||
}
|
||||
|
||||
RacyInterruptPolicy
|
||||
TestRaceDeferralChild::MediateInterruptRace(const Message& parent,
|
||||
const Message& child)
|
||||
TestRaceDeferralChild::MediateInterruptRace(const MessageInfo& parent,
|
||||
const MessageInfo& child)
|
||||
{
|
||||
return MediateRace(parent, child);
|
||||
}
|
||||
|
@ -27,7 +27,8 @@ protected:
|
||||
virtual bool AnswerLose() override;
|
||||
|
||||
virtual mozilla::ipc::RacyInterruptPolicy
|
||||
MediateInterruptRace(const Message& parent, const Message& child) override;
|
||||
MediateInterruptRace(const MessageInfo& parent,
|
||||
const MessageInfo& child) override;
|
||||
|
||||
virtual void ActorDestroy(ActorDestroyReason why) override
|
||||
{
|
||||
@ -56,7 +57,8 @@ protected:
|
||||
virtual bool AnswerRpc() override;
|
||||
|
||||
virtual mozilla::ipc::RacyInterruptPolicy
|
||||
MediateInterruptRace(const Message& parent, const Message& child) override;
|
||||
MediateInterruptRace(const MessageInfo& parent,
|
||||
const MessageInfo& child) override;
|
||||
|
||||
virtual void ActorDestroy(ActorDestroyReason why) override
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user