+ /* us trylock to avoid possible deadlock */
+ rc = ldap_pvt_thread_mutex_trylock( &connections_mutex );
+
+ if( rc ) {
+#ifdef NEW_LOGGING
+ LDAP_LOG( CONNECTION, DETAIL1,
+ "connection_resched: conn %lu reaquiring locks.\n",
+ conn->c_connid, 0, 0 );
+#else
+ Debug( LDAP_DEBUG_TRACE,
+ "connection_resched: reaquiring locks conn=%lu sd=%d\n",
+ conn->c_connid, sd, 0 );
+#endif
+ /*
+ * 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 ) {
+#ifdef NEW_LOGGING
+ LDAP_LOG( CONNECTION, INFO,
+ "connection_resched: conn %lu closed by other thread.\n",
+ conn->c_connid, 0, 0 );
+#else
+ Debug( LDAP_DEBUG_TRACE, "connection_resched: "
+ "closed by other thread conn=%lu sd=%d\n",
+ conn->c_connid, sd, 0 );
+#endif
+ } else {
+#ifdef NEW_LOGGING
+ LDAP_LOG( CONNECTION, DETAIL1,
+ "connection_resched: conn %lu attempting closing.\n",
+ conn->c_connid, 0, 0 );
+#else
+ Debug( LDAP_DEBUG_TRACE, "connection_resched: "
+ "attempting closing conn=%lu sd=%d\n",
+ conn->c_connid, sd, 0 );
+#endif
+ connection_close( conn );
+ }
+