From a1008b1f6abf155912829f54a2512e496aeb5bce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Patrick=20B=C3=B6ker?= Date: Sat, 3 Jan 2026 23:44:50 +0100 Subject: [PATCH] Persist and lazily initialize `ResizePseudoConsole` func Both GetProcAddress as well as LoadLibrary are fairly expensive. So cache the result. This is racy, but it doesn't matter much, on a collision we'll do a bit of throw away work, but the assignment of `pfnResize` is atomic. So nothing bad will happen. --- src/win/process.c | 27 ++++++++++++++++----------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/src/win/process.c b/src/win/process.c index 5820ec054..21fc5bd83 100644 --- a/src/win/process.c +++ b/src/win/process.c @@ -935,20 +935,25 @@ void uv__process_endgame(uv_loop_t* loop, uv_process_t* handle) { int uv_pty_resize(uv_process_t* process, unsigned short cols, unsigned short rows) { + static PFNRESIZEPSEUDOCONSOLE pfnResize = NULL; + if (process->pty_handle == NULL) return UV_EINVAL; - HANDLE hLibrary = LoadLibraryExW(L"kernel32.dll", 0, 0); - // Error loading kernel32.dll: (error code %i) - if (!hLibrary) - return uv_translate_sys_error(GetLastError()); - PFNRESIZEPSEUDOCONSOLE pfnResize = (PFNRESIZEPSEUDOCONSOLE)GetProcAddress((HMODULE)hLibrary,"ResizePseudoConsole"); - if (!pfnResize) { - int err = GetLastError(); - if (err == ERROR_PROC_NOT_FOUND) - return UV_ENOTSUP; - else - return uv_translate_sys_error(err); + if (pfnResize == NULL) { + HANDLE hLibrary = LoadLibraryExW(L"kernel32.dll", 0, 0); + // Error loading kernel32.dll: (error code %i) + if (!hLibrary) + return uv_translate_sys_error(GetLastError()); + + pfnResize = (PFNRESIZEPSEUDOCONSOLE)GetProcAddress((HMODULE)hLibrary,"ResizePseudoConsole"); + if (!pfnResize) { + int err = GetLastError(); + if (err == ERROR_PROC_NOT_FOUND) + return UV_ENOTSUP; + else + return uv_translate_sys_error(err); + } } COORD size = {cols, rows};