Bug 1130051 - Restore old semantics of IPDL 'compress' attribute. r=billm

In bug 1076820, the semantics of the IPDL 'compress' attribute were
changed to remove *all* duplicate messages of a type from the IPDL
message queue.  This restores the original behavior, where duplicates
were only removed if they were adjacent in the message queue.
This commit is contained in:
David Parks 2015-02-12 12:32:03 -08:00
parent 1046e1718b
commit fb471e3343

View File

@ -606,19 +606,6 @@ MessageChannel::ShouldDeferMessage(const Message& aMsg)
return mSide == ParentSide && aMsg.transaction_id() != mCurrentTransaction;
}
// Predicate that is true for messages that should be consolidated if 'compress' is set.
class MatchingKinds {
typedef IPC::Message Message;
Message::msgid_t mType;
int32_t mRoutingId;
public:
MatchingKinds(Message::msgid_t aType, int32_t aRoutingId) :
mType(aType), mRoutingId(aRoutingId) {}
bool operator()(const Message &msg) {
return msg.type() == mType && msg.routing_id() == mRoutingId;
}
};
void
MessageChannel::OnMessageReceivedFromLink(const Message& aMsg)
{
@ -662,22 +649,15 @@ MessageChannel::OnMessageReceivedFromLink(const Message& aMsg)
// Prioritized messages cannot be compressed.
MOZ_ASSERT(!aMsg.compress() || aMsg.priority() == IPC::Message::PRIORITY_NORMAL);
bool compress = (aMsg.compress() && !mPending.empty());
bool compress = (aMsg.compress() && !mPending.empty() &&
mPending.back().type() == aMsg.type() &&
mPending.back().routing_id() == aMsg.routing_id());
if (compress) {
// Check the message queue for another message with this type/destination.
auto it = std::find_if(mPending.rbegin(), mPending.rend(),
MatchingKinds(aMsg.type(), aMsg.routing_id()));
if (it != mPending.rend()) {
// This message type has compression enabled, and the queue holds
// a message with the same message type and routed to the same destination.
// Erase it. Note that, since we always compress these redundancies, There Can
// Be Only One.
MOZ_ASSERT((*it).compress());
mPending.erase((++it).base());
} else {
// No other messages with the same type/destination exist.
compress = false;
}
// This message type has compression enabled, and the back of the
// queue was the same message type and routed to the same destination.
// Replace it with the newer message.
MOZ_ASSERT(mPending.back().compress());
mPending.pop_back();
}
bool shouldWakeUp = AwaitingInterruptReply() ||