while ( !LDAP_CIRCLEQ_EMPTY( &b->b_bindconns ) ) {
Connection *c = LDAP_CIRCLEQ_FIRST( &b->b_bindconns );
- TAvlnode *root;
- long freed;
CONNECTION_LOCK(c);
Debug( LDAP_DEBUG_CONNS, "backends_destroy: "
"destroying bind connection connid=%lu, pending ops=%ld\n",
c->c_connid, c->c_n_ops_executing );
- root = c->c_ops;
- c->c_ops = NULL;
- CONNECTION_UNLOCK_INCREF(c);
-
- freed = tavl_free( root, (AVL_FREE)operation_lost_upstream );
-
- CONNECTION_LOCK_DECREF(c);
- assert( freed == c->c_n_ops_executing );
assert( c->c_live );
UPSTREAM_DESTROY(c);
}
while ( !LDAP_CIRCLEQ_EMPTY( &b->b_conns ) ) {
Connection *c = LDAP_CIRCLEQ_FIRST( &b->b_conns );
- TAvlnode *root;
- long freed;
CONNECTION_LOCK(c);
Debug( LDAP_DEBUG_CONNS, "backends_destroy: "
"ops=%ld\n",
c->c_connid, c->c_n_ops_executing );
- root = c->c_ops;
- c->c_ops = NULL;
- CONNECTION_UNLOCK_INCREF(c);
-
- freed = tavl_free( root, (AVL_FREE)operation_lost_upstream );
-
- CONNECTION_LOCK_DECREF(c);
- assert( freed == c->c_n_ops_executing );
assert( c->c_live );
UPSTREAM_DESTROY(c);
}
}
CONNECTION_UNLOCK_INCREF(c);
+ /* Before we acquire any locks */
+ event_del( c->c_write_event );
+
ldap_pvt_thread_mutex_lock( &c->c_io_mutex );
Debug( LDAP_DEBUG_CONNS, "client_write_cb: "
"have something to write to client %lu\n",
}
CONNECTION_UNLOCK_INCREF(c);
+ /* Before we acquire any locks */
+ event_del( c->c_write_event );
+
ldap_pvt_thread_mutex_lock( &c->c_io_mutex );
Debug( LDAP_DEBUG_CONNS, "upstream_write_cb: "
"have something to write to upstream %lu\n",
{
Backend *b = c->c_private;
struct event *read_event, *write_event;
+ TAvlnode *root;
+ long freed;
Debug( LDAP_DEBUG_CONNS, "upstream_destroy: "
"freeing connection %lu\n",
c->c_state = SLAP_C_INVALID;
+ root = c->c_ops;
+ c->c_ops = NULL;
+
read_event = c->c_read_event;
write_event = c->c_write_event;
CONNECTION_UNLOCK_INCREF(c);
+ freed = tavl_free( root, (AVL_FREE)operation_lost_upstream );
+
/*
* Avoid a deadlock:
* event_del will block if the event is currently executing its callback,