Bug 1261094 - Improve how MessageChannel::mInterruptStack is used in IPC code, r=jld

This commit is contained in:
Andrea Marchesini 2016-04-28 07:21:49 +08:00
parent de41c2626d
commit a9b65ecfb0
14 changed files with 62 additions and 35 deletions

View File

@ -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:

View File

@ -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);

View File

@ -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);
}

View File

@ -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);
}

View File

@ -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

View File

@ -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";

View File

@ -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

View File

@ -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;
}

View File

@ -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;
}
//-----------------------------------------------------------------------------

View File

@ -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);
}

View File

@ -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);
}

View File

@ -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
{

View File

@ -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);
}

View File

@ -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
{