if ( flags & CONN_IS_CLIENT ) {
c->c_connid = 0;
c->c_conn_state = SLAP_C_CLIENT;
+ ldap_pvt_thread_mutex_lock( &connections_mutex );
c->c_struct_state = SLAP_C_USED;
+ ldap_pvt_thread_mutex_unlock( &connections_mutex );
c->c_close_reason = "?"; /* should never be needed */
ber_sockbuf_ctrl( c->c_sb, LBER_SB_OPT_SET_FD, &sfd );
ldap_pvt_thread_mutex_unlock( &c->c_mutex );
ldap_pvt_thread_mutex_unlock( &conn_nextid_mutex );
c->c_conn_state = SLAP_C_INACTIVE;
+ ldap_pvt_thread_mutex_lock( &connections_mutex );
c->c_struct_state = SLAP_C_USED;
+ ldap_pvt_thread_mutex_unlock( &connections_mutex );
c->c_close_reason = "?"; /* should never be needed */
c->c_ssf = c->c_transport_ssf = ssf;
for(; *index < dtblsize; (*index)++) {
int c_struct;
if( connections[*index].c_struct_state == SLAP_C_UNINITIALIZED ) {
+ /* FIXME: accessing c_conn_state without locking c_mutex */
assert( connections[*index].c_conn_state == SLAP_C_INVALID );
continue;
}
if( connections[*index].c_struct_state == SLAP_C_USED ) {
- assert( connections[*index].c_conn_state != SLAP_C_INVALID );
c = &connections[(*index)++];
if ( ldap_pvt_thread_mutex_trylock( &c->c_mutex )) {
/* avoid deadlock */
continue;
}
}
+ assert( c->c_conn_state != SLAP_C_INVALID );
break;
}
if ( c_struct == SLAP_C_PENDING )
continue;
assert( c_struct == SLAP_C_UNUSED );
+ /* FIXME: accessing c_conn_state without locking c_mutex */
assert( connections[*index].c_conn_state == SLAP_C_INVALID );
}