]> git.openfabrics.org - ~shefty/rdma-win.git/commitdiff
wv/device: add framework to create/destroy device object
authorshefty <shefty@ad392aa1-c5ef-ae45-8dd8-e69d62a5ef86>
Thu, 6 Mar 2008 08:04:23 +0000 (08:04 +0000)
committershefty <shefty@ad392aa1-c5ef-ae45-8dd8-e69d62a5ef86>
Thu, 6 Mar 2008 08:04:23 +0000 (08:04 +0000)
Allow allocating and destroying the device object.  Only the structure is allocated.  The device is not associated with any specific RDMA device.

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

branches/winverbs/core/winverbs/user/wv_device.cpp
branches/winverbs/core/winverbs/user/wv_device.h
branches/winverbs/core/winverbs/user/wv_provider.cpp

index 7b3c3b6cae400643d04308396b7f155043f4ca08..8d2665f4075c22c767be519fb0bcd519f64f4b41 100644 (file)
 STDMETHODIMP CWVDevice::\r
 QueryInterface(REFIID riid, LPVOID FAR* ppvObj)\r
 {\r
-       UNREFERENCED_PARAMETER(riid);\r
-       UNREFERENCED_PARAMETER(ppvObj);\r
-\r
-       return E_NOTIMPL;\r
+       if (riid != IID_IUnknown && riid != IID_IWVDevice)\r
+       {\r
+               *ppvObj = NULL;\r
+               return E_NOINTERFACE;\r
+       }\r
+\r
+       *ppvObj = this;\r
+       InterlockedIncrement(&m_nRef);\r
+       return WV_SUCCESS;\r
 }\r
 \r
 STDMETHODIMP_(ULONG) CWVDevice::\r
 AddRef(void)\r
 {\r
-       return 0;\r
+       return InterlockedIncrement(&m_nRef);\r
 }\r
 \r
 STDMETHODIMP_(ULONG) CWVDevice::\r
 Release(void)\r
 {\r
-       return 0;\r
+       ULONG ref;\r
+\r
+       ref = (ULONG) InterlockedDecrement(&m_nRef);\r
+       if (ref == 0)\r
+               delete this;\r
+       return ref;\r
 }\r
 \r
 STDMETHODIMP CWVDevice::\r
@@ -68,6 +78,14 @@ GetOverlappedResult(OVERLAPPED *pOverlapped,
        return E_NOTIMPL;\r
 }\r
 \r
+STDMETHODIMP CWVDevice::\r
+Open(UINT64 Guid)\r
+{\r
+       UNREFERENCED_PARAMETER(Guid);\r
+\r
+       return E_NOTIMPL;\r
+}\r
+\r
 //static void\r
 //SetDeviceCap(DWORD *pFlags, ib_ca_attr_t *pCaAttr)\r
 //{\r
index a9b7a5027dc122f9114b5d11dd5a2fe5a861f0ef..1c87e3af5531e3ae704cabccdb3e708268297cfa 100644 (file)
@@ -55,6 +55,23 @@ public:
        STDMETHODIMP CreateCompletionQueue(SIZE_T *pEntries, IWVCompletionQueue** ppCq);\r
        STDMETHODIMP AllocateProtectionDomain(IWVProtectionDomain** ppPd);\r
        STDMETHODIMP Notify(OVERLAPPED* pOverlapped, WV_EVENT* pEvent);\r
+\r
+       CWVDevice(IWVProvider *pProvider)\r
+       {\r
+               pProvider->AddRef();\r
+               m_pProvider = pProvider;\r
+               m_nRef = 0;\r
+       }\r
+       ~CWVDevice()\r
+       {\r
+               m_pProvider->Release();\r
+       }\r
+\r
+       STDMETHODIMP Open(UINT64 Guid);\r
+\r
+private:\r
+       volatile LONG   m_nRef;\r
+       IWVProvider             *m_pProvider;\r
 };\r
 \r
 #endif // __WV_DEVICE_H_\r
index 577fa793d239456c11c9b126afbde599ef93c032..caf52902278e2c43ad676290916697bb0dc24e3f 100644 (file)
@@ -29,6 +29,7 @@
 \r
 #include "wv_base.h"\r
 #include "wv_provider.h"\r
+#include "wv_device.h"\r
 \r
 STDMETHODIMP CWVProvider::\r
 QueryInterface(REFIID riid, LPVOID FAR* ppvObj)\r
@@ -73,10 +74,17 @@ QueryDeviceList(UINT64* pGuidList, SIZE_T* pBufferSize)
 STDMETHODIMP CWVProvider::\r
 QueryDevice(UINT64 Guid, WV_DEVICE_ATTRIBUTES* pAttributes)\r
 {\r
-       UNREFERENCED_PARAMETER(Guid);\r
-       UNREFERENCED_PARAMETER(pAttributes);\r
-\r
-       return E_NOTIMPL;\r
+       IWVDevice *dev;\r
+       HRESULT hr;\r
+\r
+       hr = OpenDevice(Guid, &dev);\r
+       if (hr != WV_SUCCESS)\r
+               goto out;\r
+       \r
+       hr = dev->Query(pAttributes);\r
+       dev->Release();\r
+out:\r
+       return hr;\r
 }\r
 \r
 STDMETHODIMP CWVProvider::\r
@@ -91,10 +99,29 @@ QueryAddressList(WV_ADDRESS_LIST* pAddressList, SIZE_T* pBufferSize)
 STDMETHODIMP CWVProvider::\r
 OpenDevice(UINT64 Guid, IWVDevice** ppDevice)\r
 {\r
-       UNREFERENCED_PARAMETER(Guid);\r
-       UNREFERENCED_PARAMETER(ppDevice);\r
+       HRESULT hr;\r
+       CWVDevice *dev;\r
 \r
-       return E_NOTIMPL;\r
+       dev = new CWVDevice(this);\r
+       if (!dev)\r
+       {\r
+               hr = WV_NO_MEMORY;\r
+               goto err1;\r
+       }\r
+\r
+       dev->QueryInterface(IID_IWVDevice, (LPVOID*) ppDevice);\r
+\r
+       hr = dev->Open(Guid);\r
+       if (hr != WV_SUCCESS)\r
+               goto err2;\r
+\r
+       return WV_SUCCESS;\r
+\r
+err2:\r
+       dev->Release();\r
+err1:\r
+       *ppDevice = NULL;\r
+       return hr;\r
 }\r
 \r
 STDMETHODIMP CWVProvider::\r