summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBartek IwaƄczuk <biwanczuk@gmail.com>2023-08-10 06:01:35 +0200
committerGitHub <noreply@github.com>2023-08-10 04:01:35 +0000
commit8f854782b13658f169920a1a7a21b8e6b64a0c00 (patch)
tree16f69266d92a8dbd78dee48f27e8efccf670baa5
parent2507d6fa102488ed77b41a5893b311830f6fe9c9 (diff)
fix(ext/timers): some timers are not resolved (#20055)
Fixes https://github.com/denoland/deno/issues/19866
-rw-r--r--cli/tests/unit/timers_test.ts29
-rw-r--r--ext/web/02_timers.js3
2 files changed, 31 insertions, 1 deletions
diff --git a/cli/tests/unit/timers_test.ts b/cli/tests/unit/timers_test.ts
index c50cb779c..5c076ad09 100644
--- a/cli/tests/unit/timers_test.ts
+++ b/cli/tests/unit/timers_test.ts
@@ -727,3 +727,32 @@ Deno.test({
assertEquals(output, "");
},
});
+
+// Regression test for https://github.com/denoland/deno/issues/19866
+Deno.test({
+ name: "regression for #19866",
+ fn: async () => {
+ const timeoutsFired = [];
+
+ // deno-lint-ignore require-await
+ async function start(n: number) {
+ let i = 0;
+ const intervalId = setInterval(() => {
+ i++;
+ if (i > 2) {
+ clearInterval(intervalId!);
+ }
+ timeoutsFired.push(n);
+ }, 20);
+ }
+
+ for (let n = 0; n < 100; n++) {
+ start(n);
+ }
+
+ // 3s should be plenty of time for all the intervals to fire
+ // but it might still be flaky on CI.
+ await new Promise((resolve) => setTimeout(resolve, 3000));
+ assertEquals(timeoutsFired.length, 300);
+ },
+});
diff --git a/ext/web/02_timers.js b/ext/web/02_timers.js
index cfabdeb98..ade1c7123 100644
--- a/ext/web/02_timers.js
+++ b/ext/web/02_timers.js
@@ -243,6 +243,7 @@ function runAfterTimeout(task, millis, timerInfo) {
resolved: false,
prev: scheduledTimers.tail,
next: null,
+ task,
};
// Add timerObject to the end of the list.
@@ -286,7 +287,7 @@ function runAfterTimeout(task, millis, timerInfo) {
while (currentEntry !== null) {
if (currentEntry.millis <= timerObject.millis) {
currentEntry.resolved = true;
- ArrayPrototypePush(timerTasks, task);
+ ArrayPrototypePush(timerTasks, currentEntry.task);
removeFromScheduledTimers(currentEntry);
if (currentEntry === timerObject) {