зеркало из https://github.com/mozilla/gecko-dev.git
Bug 539343: Call DeallocSubtree() on subprotocol actors after being __delete__-ed. r=bent
This commit is contained in:
Родитель
90128359d2
Коммит
7db6c82f97
|
@ -2782,16 +2782,20 @@ class _GenerateProtocolActorCode(ipdl.ast.Visitor):
|
|||
|
||||
# OnChannelClose()
|
||||
onclose = MethodDefn(MethodDecl('OnChannelClose'))
|
||||
onclose.addstmt(StmtExpr(ExprCall(
|
||||
destroysubtreevar,
|
||||
args=[ _DestroyReason.NormalShutdown ])))
|
||||
onclose.addstmts([
|
||||
StmtExpr(ExprCall(destroysubtreevar,
|
||||
args=[ _DestroyReason.NormalShutdown ])),
|
||||
StmtExpr(ExprCall(deallocsubtreevar))
|
||||
])
|
||||
self.cls.addstmts([ onclose, Whitespace.NL ])
|
||||
|
||||
# OnChannelClose()
|
||||
onerror = MethodDefn(MethodDecl('OnChannelError'))
|
||||
onerror.addstmt(StmtExpr(ExprCall(
|
||||
destroysubtreevar,
|
||||
args=[ _DestroyReason.AbnormalShutdown ])))
|
||||
onerror.addstmts([
|
||||
StmtExpr(ExprCall(destroysubtreevar,
|
||||
args=[ _DestroyReason.AbnormalShutdown ])),
|
||||
StmtExpr(ExprCall(deallocsubtreevar))
|
||||
])
|
||||
self.cls.addstmts([ onerror, Whitespace.NL ])
|
||||
|
||||
# FIXME: only manager protocols and non-manager protocols with
|
||||
|
@ -2884,12 +2888,6 @@ class _GenerateProtocolActorCode(ipdl.ast.Visitor):
|
|||
# finally, destroy "us"
|
||||
destroysubtree.addstmt(StmtExpr(
|
||||
ExprCall(_destroyMethod(), args=[ whyvar ])))
|
||||
|
||||
# XXX kick off DeallocSubtree() here rather than in a new
|
||||
# event because that may be tricky on shutdown. revisit if
|
||||
# need be
|
||||
if p.decl.type.isToplevel():
|
||||
destroysubtree.addstmt(StmtExpr(ExprCall(deallocsubtreevar)))
|
||||
|
||||
self.cls.addstmts([ destroysubtree, Whitespace.NL ])
|
||||
|
||||
|
@ -3434,10 +3432,11 @@ class _GenerateProtocolActorCode(ipdl.ast.Visitor):
|
|||
|
||||
def dtorEpilogue(self, md, actorexpr):
|
||||
return (self.unregisterActor(actorexpr)
|
||||
+ [ StmtExpr(self.callActorDestroy(actorexpr)) ]
|
||||
+ [ StmtExpr(self.callRemoveActor(actorexpr)) ]
|
||||
+ [ StmtExpr(self.callDeallocActor(md, actorexpr))
|
||||
])
|
||||
+ [ StmtExpr(self.callActorDestroy(actorexpr)),
|
||||
StmtExpr(self.callRemoveActor(actorexpr)),
|
||||
StmtExpr(self.callDeallocSubtree(md, actorexpr)),
|
||||
StmtExpr(self.callDeallocActor(md, actorexpr))
|
||||
])
|
||||
|
||||
def genAsyncSendMethod(self, md):
|
||||
method = MethodDefn(self.makeSendMethodDecl(md))
|
||||
|
@ -3746,6 +3745,9 @@ class _GenerateProtocolActorCode(ipdl.ast.Visitor):
|
|||
actorarray = self.protocol.managerArrayExpr(actorexpr, self.side)
|
||||
return _callCxxArrayRemoveSorted(actorarray, actorexpr)
|
||||
|
||||
def callDeallocSubtree(self, md, actorexpr):
|
||||
return ExprCall(ExprSelect(actorexpr, '->', 'DeallocSubtree'))
|
||||
|
||||
def callDeallocActor(self, md, actorexpr):
|
||||
actor = md.decl.type.constructedType()
|
||||
return ExprCall(
|
||||
|
|
|
@ -104,6 +104,6 @@ check-valgrind::
|
|||
@$(EXIT_ON_ERROR) \
|
||||
for test in $(IPDLTESTS); do \
|
||||
$(RUN_TEST_PROGRAM) -g -d \
|
||||
valgrind -a '--leak-check=full --error-exitcode=1 --trace-children=yes -q' \
|
||||
valgrind -a '--leak-check=full --trace-children=yes -q' \
|
||||
$(IPDLUNITTEST_BIN) $$test ; \
|
||||
done
|
||||
|
|
Загрузка…
Ссылка в новой задаче