author Andrew McCreight <>
Mon, 22 Apr 2019 16:34:51 +0000
changeset 470376 3073770e06f157040f4c64951b7e8425e1ad7bbe
parent 456424 3a443a1bc66ef04eda900f0fd3e4c3d074fb2723
child 472311 5b08dd3eeec974c6ae229134906fc79dec7ef2ba
permissions -rw-r--r--
Bug 1535403 - Take indirection into account for the CC optimizations for the outer window wrapper. r=peterv Most wrapper cached C++ objects are held alive by their wrapper. The cycle collector takes advantage of this in many classes and ignores the C++ object if the wrapper is marked black. However, this is not true for the outer window's wrapper. Instead, the outer window's wrapper keeps the inner window alive. The inner window usually keeps its outer window alive, but not after it has been unlinked. For reasons I do not yet understand, the outer window's wrapper can be kept alive after the inner window it is a proxy for is unlinked. This patch fixes the cycle collector optimization for the outer window by only applying it if the outer window still has a weak reference to the inner window, which it will until the inner no longer holds the outer alive. This in turn fixes, or at least helps fix, window leaks seen intermittently when the lifetime of outer windows and docshells are tied together. The code comment is based on a review comment by peterv. Differential Revision:

# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at

# Setup for build cache

# builds where buildprops didn't have the data (eg: taskcluster) and without sccache disabled:
if test -z "$bucket" -a -z "$SCCACHE_DISABLE" -a -z "$MOZ_PGO"; then

    # prevent rerun if az is set, or wget is not available
    if test -z "$availability_zone" -a -x "$(command -v wget)"; then
        if test -n "${TASKCLUSTER_WORKER_GROUP}"; then
            # TASKCLUSTER_WORKER_GROUP is just the region now, so
            # stick an extra character on to make the already-convoluted logic
            # here simpler.
            # timeout after 1 second, and don't retry (failure indicates instance is not in ec2 or network issue)
            # availability_zone is of the form <region><letter> where region is e.g. us-west-2, and az is us-west-2a
            availability_zone=$(wget -T 1 -t 1 -q -O - || true)
        if test -z "$availability_zone" -o "$availability_zone" = "not-ec2"; then
            # region is az with last letter trimmed
            # set S3 bucket according to tree (level)
            case "${GECKO_HEAD_REPOSITORY}" in

if test -n "$bucket"; then
    mk_add_options "export SCCACHE_BUCKET=$bucket"
    export CCACHE="$topsrcdir/sccache2/sccache"
    mk_add_options MOZBUILD_MANAGE_SCCACHE_DAEMON=${topsrcdir}/sccache2/sccache