From b70c7fd078643322e4d0d4a4d8f4039bef932cc5 Mon Sep 17 00:00:00 2001 From: Oskar Hubert Weber Date: Tue, 1 Jul 2025 16:53:11 +0000 Subject: [PATCH] fix: skip cleanup in L0 DllMain when terminating process Per https://learn.microsoft.com/en-us/windows/win32/dlls/dllmain, it's not safe to cleanup resources in DllMain when fdwReason == DLL_PROCESS_DETACH and lpvReserved != NULL (the process is terminating), e.g. can result in a hang in some cases. Related-To: NEO-14121 Signed-off-by: Oskar Hubert Weber --- level_zero/core/source/windows/driver_teardown.cpp | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/level_zero/core/source/windows/driver_teardown.cpp b/level_zero/core/source/windows/driver_teardown.cpp index 8391df817d..76cf20a8e1 100644 --- a/level_zero/core/source/windows/driver_teardown.cpp +++ b/level_zero/core/source/windows/driver_teardown.cpp @@ -17,10 +17,14 @@ BOOL APIENTRY DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) { L0::globalDriverSetup(); } if (fdwReason == DLL_PROCESS_DETACH) { - L0::globalDriverTeardown(); - if (L0::globalOsSysmanDriver != nullptr) { - delete L0::globalOsSysmanDriver; - L0::globalOsSysmanDriver = nullptr; + /* If lpvReserved is non-NULL with DLL_PROCESS_DETACH, the process is terminating, + * cleanup should be skipped according to the DllMain spec. */ + if (!lpvReserved) { + L0::globalDriverTeardown(); + if (L0::globalOsSysmanDriver != nullptr) { + delete L0::globalOsSysmanDriver; + L0::globalOsSysmanDriver = nullptr; + } } } return TRUE;