tools/jprof/intcnt.cpp
author Jamie Nicol <jnicol@mozilla.com>
Wed, 12 Jan 2022 16:43:51 +0000
changeset 675121 4950158ef3622526b16a4644b17d9bdc6c448446
parent 533940 e1993a1f09ac53cd1a04fdf6a87f8cad8e44f73e
permissions -rw-r--r--
Bug 1749745 - Initialize AndroidCompositorWidget with initial size. r=aosmond,agi a=RyanVM,dsmith Since bug 1747116 landed, if the compositor is reinitialized whilst the Android Surface is invalid, we avoid crashing when querying the window size and instead keep the compositor in a paused state. However, in this case we will believe the widget size is 0x0 until the compositor is eventually resumed. If webrender receives a display list during this time, it will set an empty view rect. This means when the compositor is subsequently resumed webrender believes it has nothing to render, and we get stuck in a state where nothing is ever rendered to the screen. This patch initializes the AndroidCompositorWidget with an initial size, which avoids the problem. Differential Revision: https://phabricator.services.mozilla.com/D135711

/* 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 http://mozilla.org/MPL/2.0/. */

#include "intcnt.h"

IntCount::IntCount() : numInts(0), iPair(nullptr) {}
IntCount::~IntCount() { delete[] iPair; }
int IntCount::getSize() { return numInts; }
int IntCount::getCount(int pos) { return iPair[pos].cnt; }
int IntCount::getIndex(int pos) { return iPair[pos].idx; }

void IntCount::clear() {
  delete[] iPair;
  iPair = new IntPair[0];
  numInts = 0;
}

int IntCount::countAdd(int index, int increment) {
  if (numInts) {
    // Do a binary search to find the element
    int divPoint = 0;

    if (index > iPair[numInts - 1].idx) {
      divPoint = numInts;
    } else if (index < iPair[0].idx) {
      divPoint = 0;
    } else {
      int low = 0, high = numInts - 1;
      int mid = (low + high) / 2;
      while (1) {
        mid = (low + high) / 2;

        if (index < iPair[mid].idx) {
          high = mid;
        } else if (index > iPair[mid].idx) {
          if (mid < numInts - 1 && index < iPair[mid + 1].idx) {
            divPoint = mid + 1;
            break;
          } else {
            low = mid + 1;
          }
        } else if (index == iPair[mid].idx) {
          return iPair[mid].cnt += increment;
        }
      }
    }

    int i;
    IntPair* tpair = new IntPair[numInts + 1];
    for (i = 0; i < divPoint; i++) {
      tpair[i] = iPair[i];
    }
    for (i = divPoint; i < numInts; i++) {
      tpair[i + 1] = iPair[i];
    }
    ++numInts;
    delete[] iPair;
    iPair = tpair;
    iPair[divPoint].idx = index;
    iPair[divPoint].cnt = increment;
    return increment;
  } else {
    iPair = new IntPair[1];
    numInts = 1;
    iPair[0].idx = index;
    return iPair[0].cnt = increment;
  }
}