https://git.reactos.org/?p=reactos.git;a=commitdiff;h=61d4b5fd6c6604feaa2bd9...
commit 61d4b5fd6c6604feaa2bd97ebb58f8fe1a4cc671 Author: Katayama Hirofumi MZ katayama.hirofumi.mz@gmail.com AuthorDate: Tue Feb 8 12:21:05 2022 +0900 Commit: GitHub noreply@github.com CommitDate: Tue Feb 8 12:21:05 2022 +0900
[NTUSER] Cleanup the window lists (#4346)
Cleanup the window lists that are no longer needed at the thread / process termination. CORE-11700 --- win32ss/user/ntuser/main.c | 17 +++++++++++++++++ win32ss/user/ntuser/window.h | 3 +++ 2 files changed, 20 insertions(+)
diff --git a/win32ss/user/ntuser/main.c b/win32ss/user/ntuser/main.c index 46364a10089..62e1f157271 100644 --- a/win32ss/user/ntuser/main.c +++ b/win32ss/user/ntuser/main.c @@ -180,6 +180,12 @@ UserProcessDestroy(PEPROCESS Process) if (ppiScrnSaver == ppiCurrent) ppiScrnSaver = NULL;
+ if (gpwlCache) + { + ExFreePoolWithTag(gpwlCache, USERTAG_WINDOWLIST); + gpwlCache = NULL; + } + /* Destroy user objects */ UserDestroyObjectsForOwner(gHandleTable, ppiCurrent);
@@ -697,6 +703,7 @@ ExitThreadCallback(PETHREAD Thread) PPROCESSINFO ppiCurrent; PEPROCESS Process; PTHREADINFO ptiCurrent; + PWINDOWLIST pwl, pwlNext;
Process = Thread->ThreadsProcess;
@@ -714,6 +721,16 @@ ExitThreadCallback(PETHREAD Thread)
IsRemoveAttachThread(ptiCurrent);
+ if (gpwlList) + { + for (pwl = gpwlList; pwl; pwl = pwlNext) + { + pwlNext = pwl->pNextList; + if (pwl->pti == ptiCurrent) + IntFreeHwndList(pwl); + } + } + ptiCurrent->TIF_flags |= TIF_DONTATTACHQUEUE; ptiCurrent->pClientInfo->dwTIFlags = ptiCurrent->TIF_flags;
diff --git a/win32ss/user/ntuser/window.h b/win32ss/user/ntuser/window.h index fd63e1c920f..7086af36fc5 100644 --- a/win32ss/user/ntuser/window.h +++ b/win32ss/user/ntuser/window.h @@ -90,6 +90,9 @@ typedef struct tagWINDOWLIST HWND ahwnd[ANYSIZE_ARRAY]; /* Terminated by HWND_TERMINATOR */ } WINDOWLIST, *PWINDOWLIST;
+extern PWINDOWLIST gpwlList; +extern PWINDOWLIST gpwlCache; + #define WL_IS_BAD(pwl) ((pwl)->phwndEnd <= (pwl)->phwndLast) #define WL_CAPACITY(pwl) ((pwl)->phwndEnd - &((pwl)->ahwnd[0]))