ASSERT(*ppBufferDescriptor == NULL);\r
goto Cleanup;\r
}\r
- m_CurrentlyAllocated++;\r
goto Cleanup;\r
} \r
} \r
\r
#if DBG \r
if (m_CurrentlySentBuffers == 1) {\r
- SDP_PRINT(SDP_WARN, SDP_BUFFER_POOL, ("Currently no packets are bing sent m_ClientWaiting = %s\n", \r
+ SDP_PRINT(SDP_WARN, SDP_PERFORMANCE, ("Currently no packets are bing sent m_ClientWaiting = %s\n", \r
m_ClientWaiting ? "true" : "false")); \r
}\r
#endif \r
\r
\r
Cleanup:\r
- if (!NT_SUCCESS(rc)) {\r
+ if (NT_SUCCESS(rc)) {\r
+ m_CurrentlyAllocated++;\r
+ } else {\r
if (pBufferDescriptor != NULL) {\r
if (pBufferDescriptor->pBuffer != NULL) {\r
ExFreePoolWithTag(pBufferDescriptor->pBuffer, SEND_BUFFERS_ALLOCATION_TAG);\r
ExFreePoolWithTag(pBufferDescriptor, SEND_BUFFERS_ALLOCATION_TAG);\r
pBufferDescriptor = NULL;\r
} \r
- }\r
+ } \r
*ppBufferDescriptor = pBufferDescriptor;\r
return rc;\r
}\r
m_Lock.Init(__send_cb2, this);\r
pSocketOutParam->Errno = 0;// No error\r
pSocketOutParam->pSocket = this; // give the user a handle to the socket\r
+ KeInitializeEvent(&m_ShutdownCompleteEvent, NotificationEvent , FALSE );\r
\r
return rc;\r
}\r
cm_req->pfn_cm_rep_cb = cm_rep_callback;\r
}\r
\r
+// static\r
+VOID SdpSocket::ShutdownCB(VOID* pContext)\r
+{\r
+ SdpSocket *pSocket = (SdpSocket *) pContext;\r
+ KeSetEvent(&pSocket->m_ShutdownCompleteEvent, IO_NO_INCREMENT, FALSE);;\r
+\r
+}\r
+\r
+// This is just a wrapper for some operations that have to be done for the code bellow\r
+// It will probably be converted to a macro\r
+VOID WaitForShutdownEvent(KEVENT *ShutdownCompleteEvent)\r
+{\r
+ NTSTATUS rc = STATUS_SUCCESS;\r
+ rc = MyKeWaitForSingleObject(\r
+ ShutdownCompleteEvent,\r
+ UserRequest,\r
+ UserMode,\r
+ FALSE,\r
+ NULL\r
+ );\r
+\r
+ ASSERT(NT_SUCCESS(rc));\r
+ ASSERT(rc == STATUS_SUCCESS);\r
+ KeClearEvent(ShutdownCompleteEvent);\r
+}\r
+\r
VOID SdpSocket::Shutdown()\r
{\r
+ SDP_PRINT(SDP_TRACE, SDP_SOCKET, ("SdpSocket::Shutdown called this = 0x%p\n", this)); \r
+ NTSTATUS rc = STATUS_SUCCESS;\r
\r
- //???? locking\r
+ // locking ?????\r
// if(m_shutdown - on the lock) ???\r
ib_api_status_t ib_status;\r
+ \r
m_Lock.SignalShutdown();\r
\r
- SDP_PRINT(SDP_TRACE, SDP_SOCKET, ("SdpSocket::Shutdown called this = 0x%p\n", this));\r
-\r
if (m_qp != NULL) {\r
- ib_destroy_qp(m_qp, NULL); //?????? CALL BACK ??? IMPLMENT\r
+ ib_status = ib_destroy_qp(m_qp, ShutdownCB);\r
+ ASSERT(ib_status == IB_SUCCESS);\r
+ m_qp = NULL;\r
+ WaitForShutdownEvent(&m_ShutdownCompleteEvent); \r
}\r
\r
if (m_scq != NULL) {\r
- ib_destroy_cq(m_scq, NULL); //?????? CALL BACK ??? IMPLMENT\r
+ ib_destroy_cq(m_scq, ShutdownCB); \r
+ m_scq = NULL;\r
+ WaitForShutdownEvent(&m_ShutdownCompleteEvent);\r
}\r
\r
if (m_rcq != NULL) {\r
- ib_destroy_cq(m_rcq, NULL); //?????? CALL BACK ??? IMPLMENT\r
+ ib_destroy_cq(m_rcq, ShutdownCB); \r
+ m_rcq = NULL;\r
+ WaitForShutdownEvent(&m_ShutdownCompleteEvent);\r
}\r
-\r
+ \r
if (m_pd != NULL) {\r
- ib_dealloc_pd(m_pd, NULL); //?????? CALL BACK ??? IMPLMENT\r
+ ib_dealloc_pd(m_pd, ShutdownCB); \r
+ m_pd = NULL;\r
+ WaitForShutdownEvent(&m_ShutdownCompleteEvent);\r
}\r
\r
if (mh_Ca != NULL) {\r
- ib_close_ca(mh_Ca, NULL); //?????? CALL BACK ??? IMPLMENT\r
+ ib_close_ca(mh_Ca, ShutdownCB); \r
+ mh_Ca = NULL;\r
+ WaitForShutdownEvent(&m_ShutdownCompleteEvent);\r
}\r
+ \r
\r
// Now that all ibal operations have finished we can free the memory\r
m_SendBufferPool.ShutDown();\r