From: Kurt Zeilenga Date: Tue, 5 Sep 2000 19:11:27 +0000 (+0000) Subject: Rework connection lock code to avoid unnecessary lock reaquire X-Git-Tag: LDBM_PRE_GIANT_RWLOCK~2102 X-Git-Url: https://git.sur5r.net/?a=commitdiff_plain;h=c8c969a1847e0c0f495bd7ac717ef50032a8992b;p=openldap Rework connection lock code to avoid unnecessary lock reaquire --- diff --git a/servers/slapd/connection.c b/servers/slapd/connection.c index 14e3b40c54..f50eb3d269 100644 --- a/servers/slapd/connection.c +++ b/servers/slapd/connection.c @@ -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 );