chore: avoid microtasks when flushing sync

flush-sync
Dominic Gannaway 7 months ago
parent c051a6eb1e
commit eb80b77580

@ -0,0 +1,5 @@
---
'svelte': patch
---
chore: avoid microtasks when flushing sync

@ -24,32 +24,32 @@ import {
// Not all tests are the same, and many parts have been tweaked to capture different data. // Not all tests are the same, and many parts have been tweaked to capture different data.
export const reactivity_benchmarks = [ export const reactivity_benchmarks = [
sbench_create_signals, // sbench_create_signals,
sbench_create_0to1, // sbench_create_0to1,
sbench_create_1to1, // sbench_create_1to1,
sbench_create_2to1, // sbench_create_2to1,
sbench_create_4to1, // sbench_create_4to1,
sbench_create_1000to1, // sbench_create_1000to1,
sbench_create_1to2, // sbench_create_1to2,
sbench_create_1to4, // sbench_create_1to4,
sbench_create_1to8, // sbench_create_1to8,
sbench_create_1to1000, // sbench_create_1to1000,
kairo_avoidable_owned, // kairo_avoidable_owned,
kairo_avoidable_unowned, // kairo_avoidable_unowned,
kairo_broad_owned, // kairo_broad_owned,
kairo_broad_unowned, // kairo_broad_unowned,
kairo_deep_owned, // kairo_deep_owned,
kairo_deep_unowned, // kairo_deep_unowned,
kairo_diamond_owned, kairo_diamond_owned,
kairo_diamond_unowned, kairo_diamond_unowned,
kairo_triangle_owned, // kairo_triangle_owned,
kairo_triangle_unowned, // kairo_triangle_unowned,
kairo_mux_owned, // kairo_mux_owned,
kairo_mux_unowned, // kairo_mux_unowned,
kairo_repeated_owned, // kairo_repeated_owned,
kairo_repeated_unowned, // kairo_repeated_unowned,
kairo_unstable_owned, // kairo_unstable_owned,
kairo_unstable_unowned, // kairo_unstable_unowned,
mol_bench_owned, // mol_bench_owned,
mol_bench_unowned // mol_bench_unowned
]; ];

@ -47,6 +47,7 @@ const handled_errors = new WeakSet();
let is_throwing_error = false; let is_throwing_error = false;
let is_flushing = false; let is_flushing = false;
let is_flushing_sync = false;
/** @type {Effect | null} */ /** @type {Effect | null} */
let last_scheduled_effect = null; let last_scheduled_effect = null;
@ -734,7 +735,9 @@ function flush_queued_effects(effects) {
export function schedule_effect(signal) { export function schedule_effect(signal) {
if (!is_flushing) { if (!is_flushing) {
is_flushing = true; is_flushing = true;
queueMicrotask(flush_queued_root_effects); if (!is_flushing_sync) {
queueMicrotask(flush_queued_root_effects);
}
} }
var effect = (last_scheduled_effect = signal); var effect = (last_scheduled_effect = signal);
@ -818,23 +821,30 @@ function process_effects(root) {
* @returns {T} * @returns {T}
*/ */
export function flushSync(fn) { export function flushSync(fn) {
var result; var previously_flushing_sync = is_flushing_sync;
if (fn) {
is_flushing = true;
flush_queued_root_effects();
result = fn();
}
flush_tasks(); try {
var result;
is_flushing_sync = true;
while (queued_root_effects.length > 0) { if (fn) {
is_flushing = true; is_flushing = true;
flush_queued_root_effects(); flush_queued_root_effects();
result = fn();
}
flush_tasks(); flush_tasks();
while (queued_root_effects.length > 0) {
is_flushing = true;
flush_queued_root_effects();
flush_tasks();
}
return /** @type {T} */ (result);
} finally {
is_flushing_sync = previously_flushing_sync;
} }
return /** @type {T} */ (result);
} }
/** /**

Loading…
Cancel
Save