\r
IBSP_ERROR_EXIT(\r
("WPUCreateSocketHandle() failed: %d", *lpErrno) );\r
- free_socket_info( new_socket_info );\r
+ deref_socket_info( new_socket_info );\r
return INVALID_SOCKET;\r
}\r
\r
{\r
STAT_DEC( wpusocket_num );\r
}\r
+ new_socket_info->switch_socket = INVALID_SOCKET;\r
\r
CloseHandle( new_socket_info->h_event );\r
\r
ib_destroy_socket( new_socket_info );\r
\r
- free_socket_info( new_socket_info );\r
+ deref_socket_info( new_socket_info );\r
\r
/* Be nice and reject that connection. */\r
ib_reject( incoming->cm_req_received.h_cm_req, IB_REJ_INSUF_QP );\r
{\r
STAT_DEC( wpusocket_num );\r
}\r
+ new_socket_info->switch_socket = INVALID_SOCKET;\r
\r
ib_destroy_socket( new_socket_info );\r
- free_socket_info( new_socket_info );\r
+ deref_socket_info( new_socket_info );\r
\r
*lpErrno = WSAEACCES;\r
\r
\r
error:\r
if( socket_info )\r
- free_socket_info( socket_info );\r
+ deref_socket_info( socket_info );\r
\r
CL_ASSERT( *lpErrno != 0 );\r
\r
struct ibsp_socket_info *\r
create_socket_info( void );\r
\r
-void\r
-free_socket_info(\r
- struct ibsp_socket_info *socket_info );\r
-\r
-void\r
+void AL_API\r
deref_socket_info(\r
IN struct ibsp_socket_info *p_socket );\r
\r
void\r
ib_release_cq_tinfo(\r
struct cq_thread_info *cq_tinfo );\r
+\r
void\r
ib_destroy_cq_tinfo(\r
struct cq_thread_info *cq_tinfo );\r
shutdown_and_destroy_socket_info(\r
IN OUT struct ibsp_socket_info *socket_info );\r
\r
-void\r
-destroy_qp_and_release_ressources(\r
- IN OUT struct ibsp_socket_info *socket_info );\r
-\r
void\r
ib_cq_comp(\r
void *cq_context );\r
socket_info->switch_socket = INVALID_SOCKET;\r
/*\r
* Preset to 1, IBSPCloseSocket will decrement it, and switch socket\r
- * will be freed once it goes to zero after an upcall.\r
+ * will be freed once it goes to zero.\r
*/\r
socket_info->ref_cnt = 1;\r
\r
\r
\r
/* \r
- * Function: free_sock_info\r
+ * Function: deref_sock_info\r
* \r
* Description:\r
- * This routine frees the socket context structure.\r
+ * This routine decrements a socket context's reference count, and if\r
+ * it reaches zero, frees the socket context structure.\r
*/\r
-void\r
-free_socket_info(\r
- struct ibsp_socket_info *socket_info )\r
-{\r
- IBSP_ENTER( IBSP_DBG_SI );\r
-\r
- CL_ASSERT( !socket_info->conn_item.p_map );\r
-\r
- cl_spinlock_destroy( &socket_info->buf_mem_list.mutex );\r
- cl_spinlock_destroy( &socket_info->mutex );\r
-\r
- cl_spinlock_destroy( &socket_info->send_lock );\r
- cl_spinlock_destroy( &socket_info->recv_lock );\r
-\r
- HeapFree( g_ibsp.heap, 0, socket_info );\r
-\r
- IBSP_TRACE( IBSP_DBG_SI, ("socket_info (%p)\n", socket_info) );\r
-\r
- IBSP_EXIT( IBSP_DBG_SI );\r
-}\r
-\r
-\r
-void\r
+void AL_API\r
deref_socket_info(\r
IN struct ibsp_socket_info *p_socket )\r
{\r
int ret, error;\r
\r
+ IBSP_ENTER( IBSP_DBG_SI );\r
+\r
if( !cl_atomic_dec( &p_socket->ref_cnt ) )\r
{\r
if( p_socket->switch_socket != INVALID_SOCKET )\r
p_socket->switch_socket = INVALID_SOCKET;\r
}\r
\r
- /*\r
- * This only works because the socket doesn't have its own CQ. If it\r
- * did CQ destruction would have to be async since IBSPCloseSocket can\r
- * be invoked from the CQ callback thread context, and freeing the\r
- * socket structure would need to be delayed until the CQ's destroy\r
- * callback.\r
- */\r
- free_socket_info( p_socket );\r
+ CL_ASSERT( !p_socket->qp );\r
+ CL_ASSERT( !p_socket->conn_item.p_map );\r
+\r
+ cl_spinlock_destroy( &p_socket->buf_mem_list.mutex );\r
+ cl_spinlock_destroy( &p_socket->mutex );\r
+\r
+ cl_spinlock_destroy( &p_socket->send_lock );\r
+ cl_spinlock_destroy( &p_socket->recv_lock );\r
+\r
+ HeapFree( g_ibsp.heap, 0, p_socket );\r
+\r
+ IBSP_TRACE( IBSP_DBG_SI, ("Freed socket_info (%p)\n", p_socket) );\r
}\r
+ IBSP_EXIT( IBSP_DBG_SI );\r
}\r