]> git.openfabrics.org - ~shefty/rdma-win.git/commitdiff
nd2: set file completion notification mode
authorSean Hefty <sean.hefty@intel.com>
Tue, 27 Jul 2010 22:18:29 +0000 (22:18 +0000)
committerSean Hefty <sean.hefty@intel.com>
Tue, 27 Jul 2010 22:18:29 +0000 (22:18 +0000)
Add an Init() call to the NDProvider in order to report
failure during initialization.  Set the winverbs file handle
completion notification mode according to the latest ND spec.

Signed-off-by: Sean Hefty <sean.hefty@intel.com>
git-svn-id: svn://openib.tc.cornell.edu/gen1@2853 ad392aa1-c5ef-ae45-8dd8-e69d62a5ef86

trunk/ulp/netdirect2/user/nd_provider.cpp
trunk/ulp/netdirect2/user/nd_provider.h

index 968193d483796d73c275c17aa0766572fe917423..6f94b71ee01cc1dcbe88269ae9949fb9197a39b6 100644 (file)
 \r
 CNDProvider::CNDProvider()\r
 {\r
-       WvGetObject(IID_IWVProvider, (LPVOID *) &m_pWvProvider);\r
+       m_pWvProvider = NULL;\r
+}\r
+\r
+STDMETHODIMP CNDProvider::\r
+Init()\r
+{\r
+       HRESULT hr;\r
+\r
+       hr = WvGetObject(IID_IWVProvider, (LPVOID *) &m_pWvProvider);\r
+       if (FAILED(hr)) {\r
+               return hr;\r
+       }\r
+\r
+       if (!SetFileCompletionNotificationModes(m_pWvProvider->GetFileHandle(),\r
+                                                                                       FILE_SKIP_COMPLETION_PORT_ON_SUCCESS |\r
+                                                                                       FILE_SKIP_SET_EVENT_ON_HANDLE)) {\r
+               return HRESULT_FROM_WIN32(GetLastError());\r
+       }\r
+\r
+       return ND_SUCCESS;\r
 }\r
 \r
 CNDProvider::~CNDProvider()\r
@@ -79,10 +98,6 @@ QueryAdapterAddressList(SOCKET_ADDRESS_LIST* pAddressList,
        size_t addrlen = 0, size;\r
        UINT8 *offset;\r
 \r
-       if (m_pWvProvider == NULL) {\r
-               return ND_INSUFFICIENT_RESOURCES;\r
-       }\r
-\r
        hr = getaddrinfo("..localmachine", NULL, NULL, &res);\r
        if (hr) {\r
                goto out;\r
@@ -199,12 +214,7 @@ CreateInstance(IUnknown* pUnkOuter, REFIID riid, void** ppObject)
                return E_NOINTERFACE;\r
        }\r
 \r
-       *ppObject = new CNDProvider();\r
-       if (*ppObject == NULL) {\r
-               return E_OUTOFMEMORY;\r
-       }\r
-\r
-       return S_OK;\r
+       return CNDProvider::CreateInstance((CNDProvider **) ppObject);\r
 }\r
 \r
 STDMETHODIMP CNDClassFactory::\r
index b0e370947b7b3d9cfd0acbdb62eff3a890628d50..0c38d8e54a931605a3f535e51a5974ff75aecb36 100644 (file)
@@ -53,11 +53,41 @@ public:
 \r
        CNDProvider();\r
        ~CNDProvider();\r
+\r
        void Delete() {delete this;}\r
+       static STDMETHODIMP\r
+       CreateInstance(CNDProvider **ppProvider)\r
+       {\r
+               HRESULT hr;\r
+               CNDProvider *provider;\r
+\r
+               provider = new CNDProvider();\r
+               if (provider == NULL) {\r
+                       hr = ND_NO_MEMORY;\r
+                       goto err1;\r
+               }\r
+\r
+               hr = provider->Init();\r
+               if (FAILED(hr)) {\r
+                       goto err2;\r
+               }\r
+\r
+               *ppProvider = provider;\r
+               return ND_SUCCESS;\r
+\r
+       err2:\r
+               provider->Release();\r
+       err1:\r
+               *ppProvider = NULL;\r
+               return hr;\r
+       }\r
 \r
        STDMETHODIMP QueryAdapterAddressList(SOCKET_ADDRESS_LIST* pAddressList,\r
                                                                                 SIZE_T* pcbAddressList, UINT64 adapterId);\r
        IWVProvider *m_pWvProvider;\r
+\r
+private:\r
+       STDMETHODIMP Init();\r
 };\r
 \r
 \r