Rework connection lock code to avoid unnecessary lock reaquire

This commit is contained in:
Kurt Zeilenga 2000-09-05 19:11:27 +00:00
parent fb6590f8db
commit c8c969a184

View File

@ -1098,29 +1098,35 @@ connection_resched( Connection *conn )
Operation *op;
if( conn->c_conn_state == SLAP_C_CLOSING ) {
int rc;
ber_socket_t sd;
ber_sockbuf_ctrl( conn->c_sb, LBER_SB_OPT_GET_FD, &sd );
Debug( LDAP_DEBUG_TRACE,
"connection_resched: reaquiring locks conn=%ld sd=%d\n",
conn->c_connid, sd, 0 );
/* us trylock to avoid possible deadlock */
rc = ldap_pvt_thread_mutex_trylock( &connections_mutex );
/* reaquire locks in the right order... this may
* allow another thread to close this connection,
* so recheck state
*/
ldap_pvt_thread_mutex_unlock( &conn->c_mutex );
ldap_pvt_thread_mutex_lock( &connections_mutex );
ldap_pvt_thread_mutex_lock( &conn->c_mutex );
if( rc ) {
Debug( LDAP_DEBUG_TRACE,
"connection_resched: reaquiring locks conn=%ld sd=%d\n",
conn->c_connid, sd, 0 );
/*
* reaquire locks in the right order...
* this may allow another thread to close this connection,
* so recheck state below.
*/
ldap_pvt_thread_mutex_unlock( &conn->c_mutex );
ldap_pvt_thread_mutex_lock( &connections_mutex );
ldap_pvt_thread_mutex_lock( &conn->c_mutex );
}
if( conn->c_conn_state != SLAP_C_CLOSING ) {
Debug( LDAP_DEBUG_TRACE,
"connection_resched: closed by other thread conn=%ld sd=%d\n",
Debug( LDAP_DEBUG_TRACE, "connection_resched: "
"closed by other thread conn=%ld sd=%d\n",
conn->c_connid, sd, 0 );
} else {
Debug( LDAP_DEBUG_TRACE,
"connection_resched: attempting closing conn=%ld sd=%d\n",
Debug( LDAP_DEBUG_TRACE, "connection_resched: "
"attempting closing conn=%ld sd=%d\n",
conn->c_connid, sd, 0 );
connection_close( conn );