From 4721198f47ff8a47b51913352e618920b971bf43 Mon Sep 17 00:00:00 2001 From: Paul Wang Date: Mon, 25 Nov 2024 16:24:53 -0800 Subject: [PATCH 1/2] update --- src/kernels/kernel.ts | 11 ++++++++++- src/kernels/kernelExecution.ts | 5 +++++ src/kernels/types.ts | 1 + 3 files changed, 16 insertions(+), 1 deletion(-) diff --git a/src/kernels/kernel.ts b/src/kernels/kernel.ts index a63893ad1fb..0f6f1fa0230 100644 --- a/src/kernels/kernel.ts +++ b/src/kernels/kernel.ts @@ -196,6 +196,10 @@ abstract class BaseKernel implements IBaseKernel { public get restarting() { return this._restartPromise || Promise.resolve(); } + private _postInitializingDeferred = createDeferred(); + public get postInitializing() { + return this._postInitializingDeferred.promise; + } constructor( public readonly id: string, public readonly uri: Uri, @@ -258,9 +262,14 @@ abstract class BaseKernel implements IBaseKernel { // If we started and the UI is no longer disabled (ie., a user executed a cell) // then we can signal that the kernel was created and can be used by third-party extensions. // We also only want to fire off a single event here. - if (!options?.disableUI && !this._postInitializedOnStart) { + if (!this.startupUI.disableUI && !this._postInitializedOnStart) { this._onPostInitialized.fire(); this._postInitializedOnStart = true; + // Inject a small delay to allow external event handlers a brief window + // to queue code executions. + setTimeout(() => { + this._postInitializingDeferred.resolve(); + }, 50); } return result; }); diff --git a/src/kernels/kernelExecution.ts b/src/kernels/kernelExecution.ts index 772ddb2f05a..9f7909c5fd2 100644 --- a/src/kernels/kernelExecution.ts +++ b/src/kernels/kernelExecution.ts @@ -166,8 +166,13 @@ export class NotebookKernelExecution implements INotebookKernelExecution { const sessionPromise = this.kernel.restarting.then(() => this.kernel.start(new DisplayOptions(false))); traceCellMessage(cell, `NotebookKernelExecution.executeCell (3), ${getDisplayPath(cell.notebook.uri)}`); + + // Wait for the kernel to complete post initialization before queueing the cell in case + // we need to allow extensions to run code before the initial user-triggered execution + await this.kernel.postInitializing; const executionQueue = this.getOrCreateCellExecutionQueue(cell.notebook, sessionPromise); executionQueue.queueCell(cell, codeOverride); + let success = true; try { traceCellMessage(cell, `NotebookKernelExecution.executeCell (4), ${getDisplayPath(cell.notebook.uri)}`); diff --git a/src/kernels/types.ts b/src/kernels/types.ts index b9bc32cf8a4..56810e95f6c 100644 --- a/src/kernels/types.ts +++ b/src/kernels/types.ts @@ -357,6 +357,7 @@ export interface IBaseKernel extends IAsyncDisposable { readonly onRestarted: Event; readonly onPostInitialized: Event; readonly restarting: Promise; + readonly postInitializing: Promise; readonly status: KernelMessage.Status; readonly disposed: boolean; readonly disposing: boolean; From 7abbfc8e7afeba076a88a028c9ad61d77ca9d89f Mon Sep 17 00:00:00 2001 From: Paul Wang Date: Wed, 27 Nov 2024 10:30:31 -0800 Subject: [PATCH 2/2] use 30ms --- src/kernels/kernel.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/kernels/kernel.ts b/src/kernels/kernel.ts index 0f6f1fa0230..a2d6c91f297 100644 --- a/src/kernels/kernel.ts +++ b/src/kernels/kernel.ts @@ -269,7 +269,7 @@ abstract class BaseKernel implements IBaseKernel { // to queue code executions. setTimeout(() => { this._postInitializingDeferred.resolve(); - }, 50); + }, 30); } return result; });