Bug 1349699 - Assert when destroying a MessageLoop that a live MessageChannel is attached to (r=dvander)
MozReview-Commit-ID: GGr5UqJl3ui
This commit is contained in:
@@ -488,8 +488,10 @@ private:
|
||||
nsAutoPtr<IPC::Message> mReply;
|
||||
};
|
||||
|
||||
MessageChannel::MessageChannel(IToplevelProtocol *aListener)
|
||||
: mListener(aListener),
|
||||
MessageChannel::MessageChannel(const char* aName,
|
||||
IToplevelProtocol *aListener)
|
||||
: mName(aName),
|
||||
mListener(aListener),
|
||||
mChannelState(ChannelClosed),
|
||||
mSide(UnknownSide),
|
||||
mLink(nullptr),
|
||||
@@ -627,6 +629,18 @@ MessageChannel::CanSend() const
|
||||
return Connected();
|
||||
}
|
||||
|
||||
void
|
||||
MessageChannel::WillDestroyCurrentMessageLoop()
|
||||
{
|
||||
#if !defined(ANDROID)
|
||||
#if defined(MOZ_CRASHREPORTER)
|
||||
CrashReporter::AnnotateCrashReport(NS_LITERAL_CSTRING("ProtocolName"),
|
||||
nsDependentCString(mName));
|
||||
#endif
|
||||
MOZ_CRASH("MessageLoop destroyed before MessageChannel that's bound to it");
|
||||
#endif
|
||||
}
|
||||
|
||||
void
|
||||
MessageChannel::Clear()
|
||||
{
|
||||
@@ -644,6 +658,10 @@ MessageChannel::Clear()
|
||||
gParentProcessBlocker = nullptr;
|
||||
}
|
||||
|
||||
if (mWorkerLoop) {
|
||||
mWorkerLoop->RemoveDestructionObserver(this);
|
||||
}
|
||||
|
||||
mWorkerLoop = nullptr;
|
||||
delete mLink;
|
||||
mLink = nullptr;
|
||||
@@ -676,6 +694,8 @@ MessageChannel::Open(Transport* aTransport, MessageLoop* aIOLoop, Side aSide)
|
||||
mWorkerLoop = MessageLoop::current();
|
||||
mWorkerLoopID = mWorkerLoop->id();
|
||||
|
||||
mWorkerLoop->AddDestructionObserver(this);
|
||||
|
||||
ProcessLink *link = new ProcessLink(this);
|
||||
link->Open(aTransport, aIOLoop, aSide); // :TODO: n.b.: sets mChild
|
||||
mLink = link;
|
||||
@@ -752,6 +772,7 @@ MessageChannel::CommonThreadOpenInit(MessageChannel *aTargetChan, Side aSide)
|
||||
{
|
||||
mWorkerLoop = MessageLoop::current();
|
||||
mWorkerLoopID = mWorkerLoop->id();
|
||||
mWorkerLoop->AddDestructionObserver(this);
|
||||
mLink = new ThreadLink(this, aTargetChan);
|
||||
mSide = aSide;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user