From 7980f409112cdc87890e90f9836ae52c6c3f8b76 Mon Sep 17 00:00:00 2001 From: Katayama Hirofumi MZ Date: Mon, 4 May 2020 15:28:16 +0900 Subject: [PATCH] [SHELL32] Follow-up of #2659 Add CreateAPCThread function and use it. CORE-13950 --- .../shelldesktop/CChangeNotifyServer.cpp | 27 +++++++++++-------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/dll/win32/shell32/shelldesktop/CChangeNotifyServer.cpp b/dll/win32/shell32/shelldesktop/CChangeNotifyServer.cpp index a5852976f1e..da619b9104b 100644 --- a/dll/win32/shell32/shelldesktop/CChangeNotifyServer.cpp +++ b/dll/win32/shell32/shelldesktop/CChangeNotifyServer.cpp @@ -787,6 +787,17 @@ void CChangeNotifyServer::RemoveItemsByProcess(DWORD dwOwnerPID, DWORD dwUserPID } } +BOOL CreateAPCThread(void) +{ + if (s_hThreadAPC != NULL) + return TRUE; + + unsigned tid; + s_fTerminateAllWatches = FALSE; + s_hThreadAPC = (HANDLE)_beginthreadex(NULL, 0, DirWatchThreadFuncAPC, NULL, 0, &tid); + return s_hThreadAPC != NULL; +} + // Message CN_REGISTER: Register the registration entry. // wParam: The handle of registration entry. // lParam: The owner PID of registration entry. @@ -834,18 +845,12 @@ LRESULT CChangeNotifyServer::OnRegister(UINT uMsg, WPARAM wParam, LPARAM lParam, if (pDirWatch) { // create an APC thread for directory watching - if (s_hThreadAPC == NULL) + if (!CreateAPCThread()) { - unsigned tid; - s_fTerminateAllWatches = FALSE; - s_hThreadAPC = (HANDLE)_beginthreadex(NULL, 0, DirWatchThreadFuncAPC, NULL, 0, &tid); - if (s_hThreadAPC == NULL) - { - pRegEntry->nRegID = INVALID_REG_ID; - SHUnlockShared(pRegEntry); - delete pDirWatch; - return FALSE; - } + pRegEntry->nRegID = INVALID_REG_ID; + SHUnlockShared(pRegEntry); + delete pDirWatch; + return FALSE; } // request adding the watch