diff options
Diffstat (limited to 'src/libs/dutil/WixToolset.DUtil/monutil.cpp')
| -rw-r--r-- | src/libs/dutil/WixToolset.DUtil/monutil.cpp | 34 |
1 files changed, 16 insertions, 18 deletions
diff --git a/src/libs/dutil/WixToolset.DUtil/monutil.cpp b/src/libs/dutil/WixToolset.DUtil/monutil.cpp index 6ad75b56..10954164 100644 --- a/src/libs/dutil/WixToolset.DUtil/monutil.cpp +++ b/src/libs/dutil/WixToolset.DUtil/monutil.cpp | |||
| @@ -16,6 +16,7 @@ | |||
| 16 | #define MonExitOnInvalidHandleWithLastError(p, x, s, ...) ExitOnInvalidHandleWithLastErrorSource(DUTIL_SOURCE_MONUTIL, p, x, s, __VA_ARGS__) | 16 | #define MonExitOnInvalidHandleWithLastError(p, x, s, ...) ExitOnInvalidHandleWithLastErrorSource(DUTIL_SOURCE_MONUTIL, p, x, s, __VA_ARGS__) |
| 17 | #define MonExitOnWin32Error(e, x, s, ...) ExitOnWin32ErrorSource(DUTIL_SOURCE_MONUTIL, e, x, s, __VA_ARGS__) | 17 | #define MonExitOnWin32Error(e, x, s, ...) ExitOnWin32ErrorSource(DUTIL_SOURCE_MONUTIL, e, x, s, __VA_ARGS__) |
| 18 | #define MonExitOnGdipFailure(g, x, s, ...) ExitOnGdipFailureSource(DUTIL_SOURCE_MONUTIL, g, x, s, __VA_ARGS__) | 18 | #define MonExitOnGdipFailure(g, x, s, ...) ExitOnGdipFailureSource(DUTIL_SOURCE_MONUTIL, g, x, s, __VA_ARGS__) |
| 19 | #define MonExitOnWaitObjectFailure(x, b, s, ...) ExitOnWaitObjectFailureSource(DUTIL_SOURCE_MONUTIL, x, b, s, __VA_ARGS__) | ||
| 19 | 20 | ||
| 20 | const int MON_THREAD_GROWTH = 5; | 21 | const int MON_THREAD_GROWTH = 5; |
| 21 | const int MON_ARRAY_GROWTH = 40; | 22 | const int MON_ARRAY_GROWTH = 40; |
| @@ -1101,11 +1102,12 @@ static DWORD WINAPI WaiterThread( | |||
| 1101 | { | 1102 | { |
| 1102 | HRESULT hr = S_OK; | 1103 | HRESULT hr = S_OK; |
| 1103 | HRESULT hrTemp = S_OK; | 1104 | HRESULT hrTemp = S_OK; |
| 1104 | DWORD dwRet = 0; | ||
| 1105 | BOOL fAgain = FALSE; | 1105 | BOOL fAgain = FALSE; |
| 1106 | BOOL fContinue = TRUE; | 1106 | BOOL fContinue = TRUE; |
| 1107 | BOOL fNotify = FALSE; | 1107 | BOOL fNotify = FALSE; |
| 1108 | BOOL fRet = FALSE; | 1108 | BOOL fRet = FALSE; |
| 1109 | BOOL fTimedOut = FALSE; | ||
| 1110 | DWORD dwSignaledIndex = 0; | ||
| 1109 | MSG msg = { }; | 1111 | MSG msg = { }; |
| 1110 | MON_ADD_MESSAGE *pAddMessage = NULL; | 1112 | MON_ADD_MESSAGE *pAddMessage = NULL; |
| 1111 | MON_REMOVE_MESSAGE *pRemoveMessage = NULL; | 1113 | MON_REMOVE_MESSAGE *pRemoveMessage = NULL; |
| @@ -1128,13 +1130,14 @@ static DWORD WINAPI WaiterThread( | |||
| 1128 | 1130 | ||
| 1129 | do | 1131 | do |
| 1130 | { | 1132 | { |
| 1131 | dwRet = ::WaitForMultipleObjects(pWaiterContext->cHandles - pWaiterContext->cRequestsFailing, pWaiterContext->rgHandles, FALSE, pWaiterContext->cRequestsPending > 0 ? dwWait : INFINITE); | 1133 | hr = AppWaitForMultipleObjects(pWaiterContext->cHandles - pWaiterContext->cRequestsFailing, pWaiterContext->rgHandles, FALSE, pWaiterContext->cRequestsPending > 0 ? dwWait : INFINITE, &dwSignaledIndex); |
| 1134 | MonExitOnWaitObjectFailure(hr, fTimedOut, "Failed to wait for multiple objects."); | ||
| 1132 | 1135 | ||
| 1133 | uCurrentTime = ::GetTickCount(); | 1136 | uCurrentTime = ::GetTickCount(); |
| 1134 | uDeltaInMs = uCurrentTime - uLastTimeInMs; | 1137 | uDeltaInMs = uCurrentTime - uLastTimeInMs; |
| 1135 | uLastTimeInMs = uCurrentTime; | 1138 | uLastTimeInMs = uCurrentTime; |
| 1136 | 1139 | ||
| 1137 | if (WAIT_OBJECT_0 == dwRet) | 1140 | if (!fTimedOut && 0 == dwSignaledIndex) |
| 1138 | { | 1141 | { |
| 1139 | do | 1142 | do |
| 1140 | { | 1143 | { |
| @@ -1391,10 +1394,10 @@ static DWORD WINAPI WaiterThread( | |||
| 1391 | } | 1394 | } |
| 1392 | } while (fAgain); | 1395 | } while (fAgain); |
| 1393 | } | 1396 | } |
| 1394 | else if (dwRet > WAIT_OBJECT_0 && dwRet - WAIT_OBJECT_0 < pWaiterContext->cHandles) | 1397 | else if (!fTimedOut) |
| 1395 | { | 1398 | { |
| 1396 | // OK a handle fired - only notify if it's the actual target, and not just some parent waiting for the target child to exist | 1399 | // OK a handle fired - only notify if it's the actual target, and not just some parent waiting for the target child to exist |
| 1397 | dwRequestIndex = dwRet - WAIT_OBJECT_0 - 1; | 1400 | dwRequestIndex = dwSignaledIndex - 1; |
| 1398 | fNotify = (pWaiterContext->rgRequests[dwRequestIndex].dwPathHierarchyIndex == pWaiterContext->rgRequests[dwRequestIndex].cPathHierarchy - 1); | 1401 | fNotify = (pWaiterContext->rgRequests[dwRequestIndex].dwPathHierarchyIndex == pWaiterContext->rgRequests[dwRequestIndex].cPathHierarchy - 1); |
| 1399 | 1402 | ||
| 1400 | // Initiate re-waits before we notify callback, to ensure we don't miss a single update | 1403 | // Initiate re-waits before we notify callback, to ensure we don't miss a single update |
| @@ -1426,10 +1429,6 @@ static DWORD WINAPI WaiterThread( | |||
| 1426 | } | 1429 | } |
| 1427 | } | 1430 | } |
| 1428 | } | 1431 | } |
| 1429 | else if (WAIT_TIMEOUT != dwRet) | ||
| 1430 | { | ||
| 1431 | MonExitWithLastError(hr, "Failed to wait for multiple objects with return code %u", dwRet); | ||
| 1432 | } | ||
| 1433 | 1432 | ||
| 1434 | // OK, now that we've checked all triggered handles (resetting silence period timers appropriately), check for any pending notifications that we can finally fire | 1433 | // OK, now that we've checked all triggered handles (resetting silence period timers appropriately), check for any pending notifications that we can finally fire |
| 1435 | // And set dwWait appropriately so we awaken at the right time to fire the next pending notification (in case no further writes occur during that time) | 1434 | // And set dwWait appropriately so we awaken at the right time to fire the next pending notification (in case no further writes occur during that time) |
| @@ -1726,10 +1725,10 @@ static LRESULT CALLBACK MonWndProc( | |||
| 1726 | DEV_BROADCAST_HANDLE *pHandle = NULL; | 1725 | DEV_BROADCAST_HANDLE *pHandle = NULL; |
| 1727 | DEV_BROADCAST_VOLUME *pVolume = NULL; | 1726 | DEV_BROADCAST_VOLUME *pVolume = NULL; |
| 1728 | DWORD dwUnitMask = 0; | 1727 | DWORD dwUnitMask = 0; |
| 1729 | DWORD er = ERROR_SUCCESS; | ||
| 1730 | WCHAR chDrive = L'\0'; | 1728 | WCHAR chDrive = L'\0'; |
| 1731 | BOOL fArrival = FALSE; | 1729 | BOOL fArrival = FALSE; |
| 1732 | BOOL fReturnTrue = FALSE; | 1730 | BOOL fReturnTrue = FALSE; |
| 1731 | BOOL fTimedOut = FALSE; | ||
| 1733 | CREATESTRUCT *pCreateStruct = NULL; | 1732 | CREATESTRUCT *pCreateStruct = NULL; |
| 1734 | MON_WAITER_CONTEXT *pWaiterContext = NULL; | 1733 | MON_WAITER_CONTEXT *pWaiterContext = NULL; |
| 1735 | MON_STRUCT *pm = NULL; | 1734 | MON_STRUCT *pm = NULL; |
| @@ -1821,24 +1820,23 @@ static LRESULT CALLBACK MonWndProc( | |||
| 1821 | } | 1820 | } |
| 1822 | } | 1821 | } |
| 1823 | 1822 | ||
| 1824 | er = ::WaitForSingleObject(pm->internalWait.hWait, MON_THREAD_WAIT_REMOVE_DEVICE); | 1823 | hr = AppWaitForSingleObject(pm->internalWait.hWait, MON_THREAD_WAIT_REMOVE_DEVICE); |
| 1824 | MonExitOnWaitObjectFailure(hr, fTimedOut, "WaitForSingleObject failed with non-timeout reason while waiting for response from waiter thread"); | ||
| 1825 | |||
| 1825 | // Make sure any waiter thread processing really old messages can immediately know that we're no longer waiting for a response | 1826 | // Make sure any waiter thread processing really old messages can immediately know that we're no longer waiting for a response |
| 1826 | if (WAIT_OBJECT_0 == er) | 1827 | if (!fTimedOut) |
| 1827 | { | 1828 | { |
| 1828 | // If the response ID matches what we sent, we actually got a valid reply! | 1829 | // If the response ID matches what we sent, we actually got a valid reply! |
| 1829 | if (pm->internalWait.dwReceiveIteration != pm->internalWait.dwSendIteration) | 1830 | if (pm->internalWait.dwReceiveIteration != pm->internalWait.dwSendIteration) |
| 1830 | { | 1831 | { |
| 1831 | TraceError(HRESULT_FROM_WIN32(er), "Waiter thread received wrong ID reply"); | 1832 | TraceError(E_UNEXPECTED, "Waiter thread received wrong ID reply"); |
| 1832 | } | 1833 | } |
| 1833 | } | 1834 | } |
| 1834 | else if (WAIT_TIMEOUT == er) | ||
| 1835 | { | ||
| 1836 | TraceError(HRESULT_FROM_WIN32(er), "No response from any waiter thread for query remove message"); | ||
| 1837 | } | ||
| 1838 | else | 1835 | else |
| 1839 | { | 1836 | { |
| 1840 | MonExitWithLastError(hr, "WaitForSingleObject failed with non-timeout reason while waiting for response from waiter thread"); | 1837 | TraceError(HRESULT_FROM_WIN32(WAIT_TIMEOUT), "No response from any waiter thread for query remove message"); |
| 1841 | } | 1838 | } |
| 1839 | |||
| 1842 | ++pm->internalWait.dwSendIteration; | 1840 | ++pm->internalWait.dwSendIteration; |
| 1843 | } | 1841 | } |
| 1844 | } | 1842 | } |
