Skip to content

Commit dbf8ea2

Browse files
committed
Python: Use the setTimeout from the outer isolate
Not from the pool isolate.
1 parent 9e2181e commit dbf8ea2

File tree

5 files changed

+18
-0
lines changed

5 files changed

+18
-0
lines changed

src/pyodide/helpers.bzl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -181,6 +181,7 @@ def _python_bundle(version, *, pyodide_asm_wasm = None, pyodide_asm_js = None, p
181181
reportUndefinedSymbolsPatched,
182182
wasmInstantiate,
183183
patched_PyEM_CountFuncParams,
184+
setTimeout,
184185
} from "pyodide-internal:pool/builtin_wrappers";
185186
"""
186187

src/pyodide/internal/pool/builtin_wrappers.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,19 @@ export const location = undefined;
1616

1717
export function addEventListener(): void {}
1818

19+
20+
let _outerSetTimout: typeof setTimeout;
21+
22+
export function setSetTimeout(f: typeof setTimeout) {
23+
_outerSetTimout = f;
24+
}
25+
26+
// Make sure we use the setTimeout from the outer isolate, not the pool isolate.
27+
// Otherwise we get timeout id conflicts
28+
export function setTimeout(func: () => void, ms: number): void {
29+
_outerSetTimout(func, ms);
30+
}
31+
1932
export function reportUndefinedSymbolsPatched(Module: Module): void {
2033
if (Module.API.version === '0.26.0a2') {
2134
return;

src/pyodide/internal/pool/emscriptenSetup.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import { _createPyodideModule } from 'pyodide-internal:generated/pyodide.asm';
1414
import {
1515
setUnsafeEval,
1616
setGetRandomValues,
17+
setSetTimeout,
1718
finishSetup,
1819
} from 'pyodide-internal:pool/builtin_wrappers';
1920

@@ -216,6 +217,7 @@ export async function instantiateEmscriptenModule(
216217
const emscriptenModule = await emscriptenSettings.readyPromise;
217218
emscriptenModule.setUnsafeEval = setUnsafeEval;
218219
emscriptenModule.setGetRandomValues = setGetRandomValues;
220+
emscriptenModule.setSetTimeout = setSetTimeout;
219221
finishSetup();
220222
return emscriptenModule;
221223
}

src/pyodide/internal/python.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,7 @@ export async function loadPyodide(
106106
}
107107
Module.setUnsafeEval(UnsafeEval);
108108
Module.setGetRandomValues(getRandomValues);
109+
Module.setSetTimeout(setTimeout);
109110

110111
entropyMountFiles(Module);
111112
await enterJaegerSpan('load_packages', () =>

src/pyodide/types/emscripten.d.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,7 @@ interface Module {
9797
setGetRandomValues(
9898
func: typeof import('pyodide-internal:topLevelEntropy/lib').getRandomValues
9999
): void;
100+
setSetTimeout(func: typeof setTimeout): void;
100101
getMemory(size: number): number;
101102
getMemoryPatched(
102103
Module: Module,

0 commit comments

Comments
 (0)