From 51f5c0ade89799bd9138fee5d6f71de711b08366 Mon Sep 17 00:00:00 2001 From: shefty Date: Wed, 2 Sep 2009 15:05:48 +0000 Subject: [PATCH] winmad: return correct error code Winmad returns an incorrect error code when using send or receive in synchronous mode. The OFED MAD code ends up working, since it checks for errors by comparing the return value < 0. In this case, the return value us positive, when it should be zero. Simplify the code and return the correct error code. Signed-off-by: Sean Hefty git-svn-id: svn://openib.tc.cornell.edu/gen1@2407 ad392aa1-c5ef-ae45-8dd8-e69d62a5ef86 --- .../winverbs/core/winmad/user/wm_provider.cpp | 74 +++++++------------ .../winverbs/core/winmad/user/wm_provider.h | 8 -- 2 files changed, 27 insertions(+), 55 deletions(-) diff --git a/branches/winverbs/core/winmad/user/wm_provider.cpp b/branches/winverbs/core/winmad/user/wm_provider.cpp index fb5efead..96c20da4 100644 --- a/branches/winverbs/core/winmad/user/wm_provider.cpp +++ b/branches/winverbs/core/winmad/user/wm_provider.cpp @@ -148,46 +148,6 @@ WmDeviceIoControl(HANDLE hDevice, DWORD dwIoControlCode, return ret; } -STDMETHODIMP_(BOOL) CWMProvider:: -WmReadFile(HANDLE hFile, LPVOID lpBuffer, DWORD nNumberOfBytesToRead, - LPDWORD lpNumberOfBytesRead, LPOVERLAPPED lpOverlapped) -{ - BOOL ret; - - if (lpOverlapped == NULL) { - EnterCriticalSection(&m_CritSecRead); - ReadFile(hFile, lpBuffer, nNumberOfBytesToRead, - lpNumberOfBytesRead, &m_OverlapRead); - ret = GetOverlappedResult(&m_OverlapRead, lpNumberOfBytesRead, TRUE); - LeaveCriticalSection(&m_CritSecRead); - } else { - ret = ReadFile(hFile, lpBuffer, nNumberOfBytesToRead, - lpNumberOfBytesRead, lpOverlapped); - } - - return ret; -} - -STDMETHODIMP_(BOOL) CWMProvider:: -WmWriteFile(HANDLE hFile, LPVOID lpBuffer, DWORD nNumberIfBytesToWrite, - LPDWORD lpNumberOfBytesWritten, LPOVERLAPPED lpOverlapped) -{ - BOOL ret; - - if (lpOverlapped == NULL) { - EnterCriticalSection(&m_CritSecWrite); - WriteFile(hFile, lpBuffer, nNumberIfBytesToWrite, - lpNumberOfBytesWritten, &m_OverlapWrite); - ret = GetOverlappedResult(&m_OverlapWrite, lpNumberOfBytesWritten, TRUE); - LeaveCriticalSection(&m_CritSecWrite); - } else { - ret = WriteFile(hFile, lpBuffer, nNumberIfBytesToWrite, - lpNumberOfBytesWritten, lpOverlapped); - } - - return ret; -} - STDMETHODIMP CWMProvider:: Register(WM_REGISTER *pAttributes, UINT64 *pId) { @@ -220,23 +180,43 @@ STDMETHODIMP CWMProvider:: Send(WM_MAD *pMad, OVERLAPPED *pOverlapped) { DWORD bytes; + HRESULT hr; - if (WmWriteFile(m_hFile, pMad, (DWORD) sizeof(WM_MAD) + pMad->Length, - &bytes, pOverlapped)) { - return NOERROR; + bytes = (DWORD) sizeof(WM_MAD) + pMad->Length; + if (pOverlapped == NULL) { + EnterCriticalSection(&m_CritSecWrite); + WriteFile(m_hFile, pMad, bytes, &bytes, &m_OverlapWrite); + hr = GetOverlappedResult(&m_OverlapWrite, &bytes, TRUE); + LeaveCriticalSection(&m_CritSecWrite); } else { - return HRESULT_FROM_WIN32(GetLastError()); + if (WriteFile(m_hFile, pMad, bytes, &bytes, pOverlapped)) { + hr = NOERROR; + } else { + hr = HRESULT_FROM_WIN32(GetLastError()); + } } + + return hr; } STDMETHODIMP CWMProvider:: Receive(WM_MAD *pMad, SIZE_T BufferSize, OVERLAPPED *pOverlapped) { DWORD bytes; + HRESULT hr; - if (WmReadFile(m_hFile, pMad, (DWORD) BufferSize, &bytes, pOverlapped)) { - return NOERROR; + if (pOverlapped == NULL) { + EnterCriticalSection(&m_CritSecRead); + ReadFile(m_hFile, pMad, (DWORD) BufferSize, &bytes, &m_OverlapRead); + hr = GetOverlappedResult(&m_OverlapRead, &bytes, TRUE); + LeaveCriticalSection(&m_CritSecRead); } else { - return HRESULT_FROM_WIN32(GetLastError()); + if (ReadFile(m_hFile, pMad, (DWORD) BufferSize, &bytes, pOverlapped)) { + hr = NOERROR; + } else { + hr = HRESULT_FROM_WIN32(GetLastError()); + } } + + return hr; } diff --git a/branches/winverbs/core/winmad/user/wm_provider.h b/branches/winverbs/core/winmad/user/wm_provider.h index b75c2c23..47b23ad7 100644 --- a/branches/winverbs/core/winmad/user/wm_provider.h +++ b/branches/winverbs/core/winmad/user/wm_provider.h @@ -100,14 +100,6 @@ protected: LPVOID lpOutBuffer, DWORD nOutBufferSize, LPDWORD lpBytesReturned, LPOVERLAPPED lpOverlapped); - STDMETHODIMP_(BOOL) WmReadFile(HANDLE hFile, LPVOID lpBuffer, - DWORD nNumberOfBytesToRead, - LPDWORD lpNumberOfBytesRead, - LPOVERLAPPED lpOverlapped); - STDMETHODIMP_(BOOL) WmWriteFile(HANDLE hFile, LPVOID lpBuffer, - DWORD nNumberIfBytesToWrite, - LPDWORD lpNumberOfBytesWritten, - LPOVERLAPPED lpOverlapped); OVERLAPPED m_OverlapWrite; OVERLAPPED m_OverlapRead; -- 2.46.0