コード例 #1
0
ファイル: DocGroup.cpp プロジェクト: autonome/gecko-dev
PerformanceInfo
DocGroup::ReportPerformanceInfo()
{
  AssertIsOnMainThread();
  MOZ_ASSERT(mPerformanceCounter);
#if defined(XP_WIN)
  uint32_t pid = GetCurrentProcessId();
#else
  uint32_t pid = getpid();
#endif
  uint64_t wid = 0;
  uint64_t pwid = 0;
  uint16_t count = 0;
  uint64_t duration = 0;
  nsCString host = NS_LITERAL_CSTRING("None");

  for (const auto& document : *this) {
    // grabbing the host name of the first document
    nsCOMPtr<nsIDocument> doc = do_QueryInterface(document);
    MOZ_ASSERT(doc);
    nsCOMPtr<nsIURI> docURI = doc->GetDocumentURI();
    if (!docURI) {
      continue;
    }
    docURI->GetHost(host);
    wid = doc->OuterWindowID();

    // getting the top window id - if not possible
    // pwid gets the same value than wid
    pwid = wid;
    nsPIDOMWindowInner* win = doc->GetInnerWindow();
    if (win) {
      nsPIDOMWindowOuter* outer = win->GetOuterWindow();
      if (outer) {
        nsCOMPtr<nsPIDOMWindowOuter> top = outer->GetTop();
        if (top) {
          pwid = top->WindowID();
        }
      }
    }
  }

  duration = mPerformanceCounter->GetExecutionDuration();
  FallibleTArray<CategoryDispatch> items;

  // now that we have the host and window ids, let's look at the perf counters
  for (uint32_t index = 0; index < (uint32_t)TaskCategory::Count; index++) {
    TaskCategory category = static_cast<TaskCategory>(index);
    count = mPerformanceCounter->GetDispatchCount(DispatchCategory(category));
    CategoryDispatch item = CategoryDispatch(index, count);
    if (!items.AppendElement(item, fallible)) {
      NS_ERROR("Could not complete the operation");
      return PerformanceInfo(host, pid, wid, pwid, duration, false, items);
    }
  }

  // setting back all counters to zero
  mPerformanceCounter->ResetPerformanceCounters();
  return PerformanceInfo(host, pid, wid, pwid, duration, false, items);
}
コード例 #2
0
ファイル: DocGroup.cpp プロジェクト: Noctem/gecko-dev
RefPtr<PerformanceInfoPromise> DocGroup::ReportPerformanceInfo() {
  AssertIsOnMainThread();
  MOZ_ASSERT(mPerformanceCounter);
#if defined(XP_WIN)
  uint32_t pid = GetCurrentProcessId();
#else
  uint32_t pid = getpid();
#endif
  uint64_t windowID = 0;
  uint16_t count = 0;
  uint64_t duration = 0;
  bool isTopLevel = false;
  nsCString host;
  nsCOMPtr<nsPIDOMWindowOuter> top;
  RefPtr<AbstractThread> mainThread;

  // iterating on documents until we find the top window
  for (const auto& document : *this) {
    nsCOMPtr<Document> doc = document;
    MOZ_ASSERT(doc);
    nsCOMPtr<nsIURI> docURI = doc->GetDocumentURI();
    if (!docURI) {
      continue;
    }
    docURI->GetHost(host);
    // If the host is empty, using the url
    if (host.IsEmpty()) {
      host = docURI->GetSpecOrDefault();
    }
    // looking for the top level document URI
    nsPIDOMWindowOuter* win = doc->GetWindow();
    if (!win) {
      continue;
    }
    nsPIDOMWindowOuter* outer = win->GetOuterWindow();
    if (!outer) {
      continue;
    }
    top = outer->GetTop();
    if (!top) {
      continue;
    }
    windowID = top->WindowID();
    isTopLevel = outer->IsTopLevelWindow();
    mainThread = AbstractMainThreadFor(TaskCategory::Performance);
    break;
  }

  MOZ_ASSERT(!host.IsEmpty());
  duration = mPerformanceCounter->GetExecutionDuration();
  FallibleTArray<CategoryDispatch> items;

  // now that we have the host and window ids, let's look at the perf counters
  for (uint32_t index = 0; index < (uint32_t)TaskCategory::Count; index++) {
    TaskCategory category = static_cast<TaskCategory>(index);
    count = mPerformanceCounter->GetDispatchCount(DispatchCategory(category));
    CategoryDispatch item = CategoryDispatch(index, count);
    if (!items.AppendElement(item, fallible)) {
      NS_ERROR("Could not complete the operation");
      break;
    }
  }

  if (!isTopLevel) {
    return PerformanceInfoPromise::CreateAndResolve(
        PerformanceInfo(host, pid, windowID, duration,
                        mPerformanceCounter->GetID(), false, isTopLevel,
                        PerformanceMemoryInfo(),  // Empty memory info
                        items),
        __func__);
  }

  MOZ_ASSERT(mainThread);
  RefPtr<DocGroup> self = this;

  return CollectMemoryInfo(top, mainThread)
      ->Then(
          mainThread, __func__,
          [self, host, pid, windowID, duration, isTopLevel,
           items](const PerformanceMemoryInfo& aMemoryInfo) {
            PerformanceInfo info =
                PerformanceInfo(host, pid, windowID, duration,
                                self->mPerformanceCounter->GetID(), false,
                                isTopLevel, aMemoryInfo, items);

            return PerformanceInfoPromise::CreateAndResolve(std::move(info),
                                                            __func__);
          },
          [self](const nsresult rv) {
            return PerformanceInfoPromise::CreateAndReject(rv, __func__);
          });
}