HRESULT DHContext::HostWait(HANDLE hWait, DWORD dwMilliseconds, DWORD dwOption) { DWORD dwWaitResult; BOOL bAlertable = dwOption & WAIT_ALERTABLE; if (dwOption & WAIT_MSGPUMP) { dwWaitResult = CoWaitForMultipleHandles( bAlertable ? COWAIT_ALERTABLE : 0, dwMilliseconds, 1, &hWait, NULL); } else { dwWaitResult = WaitForSingleObjectEx(hWait, dwMilliseconds, bAlertable); } switch (dwWaitResult) { case WAIT_OBJECT_0: return S_OK; case WAIT_ABANDONED: return HOST_E_ABANDONED; case WAIT_IO_COMPLETION: return HOST_E_INTERRUPTED; case WAIT_TIMEOUT: return HOST_E_TIMEOUT; case WAIT_FAILED: _ASSERTE(!"*WaitForSingleObjectEx failed"); return HRESULT_FROM_WIN32(GetLastError()); default: _ASSERTE(!"unexpected return value"); return E_FAIL; } }
HRESULT infinite_cowait(HANDLE hndl) { DWORD wr; HRESULT hr = CoWaitForMultipleHandles(COWAIT_WAITALL, INFINITE, 1, &hndl, &wr); if (wr != WAIT_OBJECT_0 || FAILED(hr)) { DBGLOG(L"event wait failed" << hr); hr = E_FAIL; } return hr; }
HRESULT zero_cowait(HANDLE hndl) { DWORD wr; HRESULT hr = CoWaitForMultipleHandles(COWAIT_WAITALL, 0, 1, &hndl, &wr); if (SUCCEEDED(hr) && WAIT_OBJECT_0 == wr) { hr = S_OK; } else { hr = E_FAIL; } return hr; }
//wait for the ConnectSucceeded or ConnectFailed call back to get called HRESULT WcnConnectNotification::WaitForConnectionResult() { HRESULT hr = S_OK; DWORD dwIndex = 0; hr = CoWaitForMultipleHandles( COWAIT_WAITALL, CONNECT_TIME_OUT, 1, &connectEndEvent, &dwIndex); if (hr == S_OK && dwIndex == 0) { ResetEvent(connectEndEvent); } else { wprintf(L"\nDiscovery timeout (after waiting %ums).", CONNECT_TIME_OUT); } return hr; }