ReadFile and WriteFile may complete asynchronously. Add a check for ERROR_IO_PENDING if the read or write calls return non-zero. If the last error is IO pending, then we need to wait for the operation to complete by calling GetOverlappedResult.
Signed-off-by: Sean Hefty <[email protected]> --- This has been committed to svn, which is far less painful going to the ofa server. Index: winmad/user/wm_provider.cpp =================================================================== --- winmad/user/wm_provider.cpp (revision 3269) +++ winmad/user/wm_provider.cpp (working copy) @@ -190,7 +190,8 @@ bytes = (DWORD) sizeof(WM_MAD) + pMad->Length; if (pOverlapped == NULL) { EnterCriticalSection(&m_CritSecWrite); - if (WriteFile(m_hFile, pMad, bytes, &bytes, &m_OverlapWrite)) { + if (WriteFile(m_hFile, pMad, bytes, NULL, &m_OverlapWrite) || + (GetLastError() == ERROR_IO_PENDING)) { hr = GetOverlappedResult(&m_OverlapWrite, &bytes, TRUE); } else { hr = HRESULT_FROM_WIN32(GetLastError()); @@ -215,7 +216,8 @@ if (pOverlapped == NULL) { EnterCriticalSection(&m_CritSecRead); - if (ReadFile(m_hFile, pMad, (DWORD) BufferSize, &bytes, &m_OverlapRead)) { + if (ReadFile(m_hFile, pMad, (DWORD) BufferSize, NULL, &m_OverlapRead) || + (GetLastError() == ERROR_IO_PENDING)) { hr = GetOverlappedResult(&m_OverlapRead, &bytes, TRUE); } else { hr = HRESULT_FROM_WIN32(GetLastError()); _______________________________________________ ofw mailing list [email protected] http://lists.openfabrics.org/cgi-bin/mailman/listinfo/ofw
