File: TaskSignal.cpp

package info (click to toggle)
firefox 147.0-1
  • links: PTS, VCS
  • area: main
  • in suites:
  • size: 4,683,324 kB
  • sloc: cpp: 7,607,156; javascript: 6,532,492; ansic: 3,775,158; python: 1,415,368; xml: 634,556; asm: 438,949; java: 186,241; sh: 62,751; makefile: 18,079; objc: 13,092; perl: 12,808; yacc: 4,583; cs: 3,846; pascal: 3,448; lex: 1,720; ruby: 1,003; php: 436; lisp: 258; awk: 247; sql: 66; sed: 54; csh: 10; exp: 6
file content (92 lines) | stat: -rw-r--r-- 3,472 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim:expandtab:shiftwidth=2:tabstop=2:
 */
/* 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 "TaskSignal.h"

#include "WebTaskScheduler.h"

namespace mozilla::dom {

NS_IMPL_CYCLE_COLLECTION_INHERITED(TaskSignal, AbortSignal,
                                   mDependentTaskSignals)

NS_IMPL_ISUPPORTS_CYCLE_COLLECTION_INHERITED_0(TaskSignal, AbortSignal)

already_AddRefed<TaskSignal> TaskSignal::Create(nsIGlobalObject* aGlobalObject,
                                                TaskPriority aPriority) {
  return do_AddRef(new TaskSignal(aGlobalObject, aPriority));
}

void TaskSignal::RunPriorityChangeAlgorithms() {
  for (const WeakPtr<WebTaskScheduler>& scheduler : mSchedulers) {
    if (scheduler) {
      scheduler->RunTaskSignalPriorityChange(this);
    }
  }
}
void TaskSignal::SetWebTaskScheduler(WebTaskScheduler* aScheduler) {
  mSchedulers.AppendElement(aScheduler);
}

// https://wicg.github.io/scheduling-apis/#create-a-dependent-task-signal
/* static */
already_AddRefed<TaskSignal> TaskSignal::Any(
    GlobalObject& aGlobal, const Sequence<OwningNonNull<AbortSignal>>& aSignals,
    const TaskSignalAnyInit& aInit) {
  nsCOMPtr<nsIGlobalObject> global = do_QueryInterface(aGlobal.GetAsSupports());
  // 1. Let resultSignal be the result of creating a dependent signal from
  // signals using the TaskSignal interface and realm.
  RefPtr<AbortSignal> abortSignal =
      AbortSignal::Any(global, aSignals, [](nsIGlobalObject* aGlobal) {
        // Use User_visible as a temporary priority for now, it'll alwasy be set
        // again later.
        RefPtr<TaskSignal> signal =
            new TaskSignal(aGlobal, TaskPriority::User_visible);
        return signal.forget();
      });

  if (!abortSignal) {
    return nullptr;
  }

  RefPtr<TaskSignal> resultSignal = static_cast<TaskSignal*>(abortSignal.get());

  // 2. Set resultSignal’s dependent to true.
  resultSignal->mDependent = true;

  // 3. If init["priority"] is a TaskPriority, then:
  if (aInit.mPriority.IsTaskPriority()) {
    // 3.1 Set resultSignal’s priority to init["priority"].
    resultSignal->SetPriority(aInit.mPriority.GetAsTaskPriority());
    return resultSignal.forget();
  }

  // 4. Otherwise:
  // 4.1. Let sourceSignal be init["priority"].
  OwningNonNull<TaskSignal> sourceSignal = aInit.mPriority.GetAsTaskSignal();

  // 4.2. Set resultSignal’s priority to sourceSignal’s priority.
  resultSignal->SetPriority(sourceSignal->Priority());

  // 4.3 If sourceSignal does not have fixed priority, then:
  if (!sourceSignal->HasFixedPriority()) {
    // 4.3.1 If sourceSignal’s dependent is true, then set sourceSignal to
    // sourceSignal’s source signal
    if (sourceSignal->mDependent) {
      sourceSignal = sourceSignal->mSourceTaskSignal;
    }
    // 4.3.2. Assert: sourceSignal is not dependent.
    MOZ_ASSERT(!sourceSignal->mDependent);
    // 4.3.3. Set resultSignal’s source signal to a weak reference to
    // sourceSignal.
    resultSignal->mSourceTaskSignal = sourceSignal;
    // 4.3.4. Append resultSignal to sourceSignal’s dependent signals.
    sourceSignal->mDependentTaskSignals.AppendElement(resultSignal);
  }
  return resultSignal.forget();
}
}  // namespace mozilla::dom