int error = 0, rc = -1;
epoch_t epoch;
- ldap_pvt_thread_mutex_lock( &b->b_mutex );
+ checked_lock( &b->b_mutex );
Debug( LDAP_DEBUG_CONNS, "upstream_connect_cb: "
"fd=%d connection callback for backend uri='%s'\n",
s, b->b_uri.bv_val );
goto done;
}
if ( error == EINTR || error == EINPROGRESS || error == EWOULDBLOCK ) {
- ldap_pvt_thread_mutex_unlock( &b->b_mutex );
+ checked_unlock( &b->b_mutex );
epoch_leave( epoch );
return;
} else if ( error ) {
backend_retry( b );
}
preempted:
- ldap_pvt_thread_mutex_unlock( &b->b_mutex );
+ checked_unlock( &b->b_mutex );
event_free( conn->event );
ch_free( conn );
return;
}
- ldap_pvt_thread_mutex_lock( &b->b_mutex );
+ checked_lock( &b->b_mutex );
/* We were already running when backend_reset tried to cancel us, but were
* already stuck waiting for the mutex, nothing to do and b_opening has
* been decremented as well */
if ( b->b_dns_req == NULL ) {
- ldap_pvt_thread_mutex_unlock( &b->b_mutex );
+ checked_unlock( &b->b_mutex );
return;
}
b->b_dns_req = NULL;
goto fail;
}
- ldap_pvt_thread_mutex_unlock( &b->b_mutex );
+ checked_unlock( &b->b_mutex );
evutil_freeaddrinfo( res );
epoch_leave( epoch );
return;
b->b_opening--;
b->b_failed++;
backend_retry( b );
- ldap_pvt_thread_mutex_unlock( &b->b_mutex );
+ checked_unlock( &b->b_mutex );
if ( res ) {
evutil_freeaddrinfo( res );
}
{
LloadBackend *b, *first, *next;
- ldap_pvt_thread_mutex_lock( &backend_mutex );
+ checked_lock( &backend_mutex );
first = b = current_backend;
- ldap_pvt_thread_mutex_unlock( &backend_mutex );
+ checked_unlock( &backend_mutex );
*res = LDAP_UNAVAILABLE;
lload_c_head *head;
LloadConnection *c;
- ldap_pvt_thread_mutex_lock( &b->b_mutex );
+ checked_lock( &b->b_mutex );
next = LDAP_CIRCLEQ_LOOP_NEXT( &backend, b, b_next );
if ( b->b_max_pending && b->b_n_ops_executing >= b->b_max_pending ) {
Debug( LDAP_DEBUG_CONNS, "backend_select: "
"backend %s too busy\n",
b->b_uri.bv_val );
- ldap_pvt_thread_mutex_unlock( &b->b_mutex );
+ checked_unlock( &b->b_mutex );
b = next;
*res = LDAP_BUSY;
continue;
}
LDAP_CIRCLEQ_FOREACH ( c, head, c_next ) {
- ldap_pvt_thread_mutex_lock( &c->c_io_mutex );
+ checked_lock( &c->c_io_mutex );
CONNECTION_LOCK(c);
if ( c->c_state == LLOAD_C_READY && !c->c_pendingber &&
( b->b_max_conn_pending == 0 ||
*/
LDAP_CIRCLEQ_MAKE_TAIL( head, c, c_next );
- ldap_pvt_thread_mutex_lock( &backend_mutex );
+ checked_lock( &backend_mutex );
current_backend = next;
- ldap_pvt_thread_mutex_unlock( &backend_mutex );
+ checked_unlock( &backend_mutex );
b->b_n_ops_executing++;
if ( op->o_tag == LDAP_REQ_BIND ) {
c->c_n_ops_executing++;
c->c_counters.lc_ops_received++;
- ldap_pvt_thread_mutex_unlock( &b->b_mutex );
+ checked_unlock( &b->b_mutex );
*res = LDAP_SUCCESS;
return c;
}
CONNECTION_UNLOCK(c);
- ldap_pvt_thread_mutex_unlock( &c->c_io_mutex );
+ checked_unlock( &c->c_io_mutex );
}
- ldap_pvt_thread_mutex_unlock( &b->b_mutex );
+ checked_unlock( &b->b_mutex );
b = next;
} while ( b != first );
char *hostname;
epoch_t epoch;
- ldap_pvt_thread_mutex_lock( &b->b_mutex );
+ checked_lock( &b->b_mutex );
assert( b->b_dns_req == NULL );
if ( b->b_cookie ) {
Debug( LDAP_DEBUG_CONNS, "backend_connect: "
"doing nothing, shutdown in progress\n" );
b->b_opening--;
- ldap_pvt_thread_mutex_unlock( &b->b_mutex );
+ checked_unlock( &b->b_mutex );
return;
}
goto fail;
}
- ldap_pvt_thread_mutex_unlock( &b->b_mutex );
+ checked_unlock( &b->b_mutex );
epoch_leave( epoch );
return;
}
*/
placeholder = (struct evdns_getaddrinfo_request *)&request;
b->b_dns_req = placeholder;
- ldap_pvt_thread_mutex_unlock( &b->b_mutex );
+ checked_unlock( &b->b_mutex );
request = evdns_getaddrinfo(
dnsbase, hostname, NULL, &hints, upstream_name_cb, b );
- ldap_pvt_thread_mutex_lock( &b->b_mutex );
+ checked_lock( &b->b_mutex );
assert( request || b->b_dns_req != placeholder );
/* Record the request, unless upstream_name_cb or another thread
if ( b->b_dns_req == placeholder ) {
b->b_dns_req = request;
}
- ldap_pvt_thread_mutex_unlock( &b->b_mutex );
+ checked_unlock( &b->b_mutex );
epoch_leave( epoch );
return;
b->b_opening--;
b->b_failed++;
backend_retry( b );
- ldap_pvt_thread_mutex_unlock( &b->b_mutex );
+ checked_unlock( &b->b_mutex );
epoch_leave( epoch );
}
if ( b->b_retry_event &&
event_pending( b->b_retry_event, EV_TIMEOUT, NULL ) ) {
assert( b->b_failed );
- ldap_pvt_thread_mutex_unlock( &b->b_mutex );
+ checked_unlock( &b->b_mutex );
event_del( b->b_retry_event );
- ldap_pvt_thread_mutex_lock( &b->b_mutex );
+ checked_lock( &b->b_mutex );
b->b_opening--;
}
if ( b->b_dns_req ) {
"destroying backend uri='%s', numconns=%d, numbindconns=%d\n",
b->b_uri.bv_val, b->b_numconns, b->b_numbindconns );
- ldap_pvt_thread_mutex_lock( &b->b_mutex );
+ checked_lock( &b->b_mutex );
b->b_numconns = b->b_numbindconns = 0;
backend_reset( b, 0 );
assert( rc == LDAP_SUCCESS );
}
#endif /* BALANCER_MODULE */
- ldap_pvt_thread_mutex_unlock( &b->b_mutex );
+ checked_unlock( &b->b_mutex );
ldap_pvt_thread_mutex_destroy( &b->b_mutex );
if ( b->b_retry_event ) {
CONNECTION_UNLOCK(client);
if ( pin ) {
- ldap_pvt_thread_mutex_lock( &op->o_link_mutex );
+ checked_lock( &op->o_link_mutex );
upstream = op->o_upstream;
- ldap_pvt_thread_mutex_unlock( &op->o_link_mutex );
+ checked_unlock( &op->o_link_mutex );
if ( upstream ) {
- ldap_pvt_thread_mutex_lock( &upstream->c_io_mutex );
+ checked_lock( &upstream->c_io_mutex );
CONNECTION_LOCK(upstream);
if ( !IS_ALIVE( upstream, c_live ) ) {
CONNECTION_UNLOCK(upstream);
- ldap_pvt_thread_mutex_unlock( &upstream->c_io_mutex );
+ checked_unlock( &upstream->c_io_mutex );
upstream = NULL;
}
}
ber = upstream->c_pendingber;
if ( ber == NULL && (ber = ber_alloc()) == NULL ) {
- ldap_pvt_thread_mutex_unlock( &upstream->c_io_mutex );
+ checked_unlock( &upstream->c_io_mutex );
if ( !pin ) {
LloadBackend *b = upstream->c_private;
upstream->c_n_ops_executing--;
CONNECTION_UNLOCK(upstream);
- ldap_pvt_thread_mutex_lock( &b->b_mutex );
+ checked_lock( &b->b_mutex );
b->b_n_ops_executing--;
operation_update_backend_counters( op, b );
- ldap_pvt_thread_mutex_unlock( &b->b_mutex );
+ checked_unlock( &b->b_mutex );
} else {
CONNECTION_UNLOCK(upstream);
}
pin = op->o_pin_id = 0;
}
} else if ( tag == LDAP_AUTH_SASL && !op->o_pin_id ) {
- ldap_pvt_thread_mutex_lock( &lload_pin_mutex );
+ checked_lock( &lload_pin_mutex );
pin = op->o_pin_id = lload_next_pin++;
Debug( LDAP_DEBUG_CONNS, "request_bind: "
"client connid=%lu allocated pin=%lu linking it to upstream "
"connid=%lu\n",
op->o_client_connid, pin, upstream->c_connid );
- ldap_pvt_thread_mutex_unlock( &lload_pin_mutex );
+ checked_unlock( &lload_pin_mutex );
}
op->o_upstream = upstream;
LloadBackend *b = upstream->c_private;
upstream->c_n_ops_executing--;
- ldap_pvt_thread_mutex_unlock( &upstream->c_io_mutex );
+ checked_unlock( &upstream->c_io_mutex );
CONNECTION_UNLOCK(upstream);
- ldap_pvt_thread_mutex_lock( &b->b_mutex );
+ checked_lock( &b->b_mutex );
b->b_n_ops_executing--;
- ldap_pvt_thread_mutex_unlock( &b->b_mutex );
+ checked_unlock( &b->b_mutex );
assert( !IS_ALIVE( client, c_live ) );
- ldap_pvt_thread_mutex_lock( &op->o_link_mutex );
+ checked_lock( &op->o_link_mutex );
if ( op->o_upstream ) {
op->o_upstream = NULL;
}
- ldap_pvt_thread_mutex_unlock( &op->o_link_mutex );
+ checked_unlock( &op->o_link_mutex );
rc = -1;
goto done;
}
{
rc = client_bind( op, upstream, &binddn, tag, &auth );
}
- ldap_pvt_thread_mutex_unlock( &upstream->c_io_mutex );
+ checked_unlock( &upstream->c_io_mutex );
done:
CONNECTION_UNLOCK(upstream);
- ldap_pvt_thread_mutex_lock( &upstream->c_io_mutex );
+ checked_lock( &upstream->c_io_mutex );
output = upstream->c_pendingber;
if ( output == NULL && (output = ber_alloc()) == NULL ) {
- ldap_pvt_thread_mutex_unlock( &upstream->c_io_mutex );
+ checked_unlock( &upstream->c_io_mutex );
CONNECTION_LOCK_DESTROY(upstream);
return -1;
}
/* Make sure noone flushes the buffer before we re-insert the operation */
CONNECTION_LOCK(upstream);
- ldap_pvt_thread_mutex_unlock( &upstream->c_io_mutex );
+ checked_unlock( &upstream->c_io_mutex );
op->o_upstream_msgid = msgid;
"connid=%lu, result=%d\n",
op->o_client_msgid, op->o_client_connid, result );
- ldap_pvt_thread_mutex_lock( &op->o_link_mutex );
+ checked_lock( &op->o_link_mutex );
upstream = op->o_upstream;
- ldap_pvt_thread_mutex_unlock( &op->o_link_mutex );
+ checked_unlock( &op->o_link_mutex );
if ( !upstream ) {
return LDAP_SUCCESS;
}
return -1;
}
- ldap_pvt_thread_mutex_lock( &op->o_link_mutex );
+ checked_lock( &op->o_link_mutex );
upstream = op->o_upstream;
- ldap_pvt_thread_mutex_unlock( &op->o_link_mutex );
+ checked_unlock( &op->o_link_mutex );
if ( !upstream ) {
return LDAP_SUCCESS;
}
if ( result == LDAP_PROTOCOL_ERROR ) {
LloadConnection *upstream;
- ldap_pvt_thread_mutex_lock( &op->o_link_mutex );
+ checked_lock( &op->o_link_mutex );
upstream = op->o_upstream;
- ldap_pvt_thread_mutex_unlock( &op->o_link_mutex );
+ checked_unlock( &op->o_link_mutex );
if ( upstream ) {
LloadBackend *b;
}
CONNECTION_UNLOCK(client);
- ldap_pvt_thread_mutex_lock( &client->c_io_mutex );
+ checked_lock( &client->c_io_mutex );
output = client->c_pendingber;
if ( output == NULL && (output = ber_alloc()) == NULL ) {
rc = -1;
- ldap_pvt_thread_mutex_unlock( &client->c_io_mutex );
+ checked_unlock( &client->c_io_mutex );
goto done;
}
client->c_pendingber = output;
LDAP_TAG_SASL_RES_CREDS, BER_BV_OPTIONAL( &creds ),
LDAP_TAG_CONTROLS, BER_BV_OPTIONAL( &controls ) );
- ldap_pvt_thread_mutex_unlock( &client->c_io_mutex );
+ checked_unlock( &client->c_io_mutex );
if ( rc >= 0 ) {
connection_write_cb( -1, 0, client );
rc = 0;
LloadBackend *b = upstream->c_private;
upstream->c_n_ops_executing--;
- ldap_pvt_thread_mutex_unlock( &upstream->c_io_mutex );
+ checked_unlock( &upstream->c_io_mutex );
CONNECTION_UNLOCK(upstream);
- ldap_pvt_thread_mutex_lock( &b->b_mutex );
+ checked_lock( &b->b_mutex );
b->b_n_ops_executing--;
- ldap_pvt_thread_mutex_unlock( &b->b_mutex );
+ checked_unlock( &b->b_mutex );
assert( !IS_ALIVE( client, c_live ) );
- ldap_pvt_thread_mutex_lock( &op->o_link_mutex );
+ checked_lock( &op->o_link_mutex );
if ( op->o_upstream ) {
op->o_upstream = NULL;
}
- ldap_pvt_thread_mutex_unlock( &op->o_link_mutex );
+ checked_unlock( &op->o_link_mutex );
return -1;
}
upstream->c_n_ops_executing--;
CONNECTION_UNLOCK(upstream);
- ldap_pvt_thread_mutex_unlock( &upstream->c_io_mutex );
+ checked_unlock( &upstream->c_io_mutex );
- ldap_pvt_thread_mutex_lock( &b->b_mutex );
+ checked_lock( &b->b_mutex );
b->b_n_ops_executing--;
operation_update_backend_counters( op, b );
- ldap_pvt_thread_mutex_unlock( &b->b_mutex );
+ checked_unlock( &b->b_mutex );
Debug( LDAP_DEBUG_ANY, "request_process: "
"ber_alloc failed\n" );
op->o_tag, &op->o_request,
LDAP_TAG_CONTROLS, BER_BV_OPTIONAL( &op->o_ctrls ) );
}
- ldap_pvt_thread_mutex_unlock( &upstream->c_io_mutex );
+ checked_unlock( &upstream->c_io_mutex );
connection_write_cb( -1, 0, upstream );
return rc;
* Also before we try to read anything from the connection, it isn't
* permitted to Abandon a StartTLS exop per RFC4511 anyway.
*/
- ldap_pvt_thread_mutex_lock( &c->c_io_mutex );
+ checked_lock( &c->c_io_mutex );
if ( c->c_pendingber ) {
- ldap_pvt_thread_mutex_unlock( &c->c_io_mutex );
+ checked_unlock( &c->c_io_mutex );
connection_write_cb( s, what, arg );
if ( !IS_ALIVE( c, c_live ) ) {
/* Do we still have data pending? If so, connection_write_cb would
* already have arranged the write callback to trigger again */
- ldap_pvt_thread_mutex_lock( &c->c_io_mutex );
+ checked_lock( &c->c_io_mutex );
if ( c->c_pendingber ) {
- ldap_pvt_thread_mutex_unlock( &c->c_io_mutex );
+ checked_unlock( &c->c_io_mutex );
return;
}
}
rc = ldap_pvt_tls_accept( c->c_sb, LLOAD_TLS_CTX );
- ldap_pvt_thread_mutex_unlock( &c->c_io_mutex );
+ checked_unlock( &c->c_io_mutex );
if ( rc < 0 ) {
goto fail;
}
/* We only register the write event when we have data pending */
event_add( c->c_read_event, c->c_read_timeout );
- ldap_pvt_thread_mutex_lock( &clients_mutex );
+ checked_lock( &clients_mutex );
LDAP_CIRCLEQ_INSERT_TAIL( &clients, c, c_next );
- ldap_pvt_thread_mutex_unlock( &clients_mutex );
+ checked_unlock( &clients_mutex );
CONNECTION_UNLOCK(c);
return c;
}
if ( state != LLOAD_C_DYING ) {
- ldap_pvt_thread_mutex_lock( &clients_mutex );
+ checked_lock( &clients_mutex );
LDAP_CIRCLEQ_REMOVE( &clients, c, c_next );
- ldap_pvt_thread_mutex_unlock( &clients_mutex );
+ checked_unlock( &clients_mutex );
}
CONNECTION_LOCK(c);
void
clients_destroy( int gentle )
{
- ldap_pvt_thread_mutex_lock( &clients_mutex );
+ checked_lock( &clients_mutex );
connections_walk(
&clients_mutex, &clients, lload_connection_close, &gentle );
- ldap_pvt_thread_mutex_unlock( &clients_mutex );
+ checked_unlock( &clients_mutex );
}
}
c->c_currentber = ber;
- ldap_pvt_thread_mutex_lock( &c->c_io_mutex );
+ checked_lock( &c->c_io_mutex );
tag = ber_get_next( c->c_sb, &len, ber );
- ldap_pvt_thread_mutex_unlock( &c->c_io_mutex );
+ checked_unlock( &c->c_io_mutex );
if ( tag != LDAP_TAG_MESSAGE ) {
int err = sock_errno();
}
c->c_currentber = ber;
- ldap_pvt_thread_mutex_lock( &c->c_io_mutex );
+ checked_lock( &c->c_io_mutex );
tag = ber_get_next( c->c_sb, &len, ber );
- ldap_pvt_thread_mutex_unlock( &c->c_io_mutex );
+ checked_unlock( &c->c_io_mutex );
if ( tag != LDAP_TAG_MESSAGE ) {
int err = sock_errno();
epoch = epoch_join();
- ldap_pvt_thread_mutex_lock( &c->c_io_mutex );
+ checked_lock( &c->c_io_mutex );
Debug( LDAP_DEBUG_CONNS, "connection_write_cb: "
"have something to write to connection connid=%lu\n",
c->c_connid );
if ( err != EWOULDBLOCK && err != EAGAIN ) {
char ebuf[128];
- ldap_pvt_thread_mutex_unlock( &c->c_io_mutex );
+ checked_unlock( &c->c_io_mutex );
Debug( LDAP_DEBUG_ANY, "connection_write_cb: "
"ber_flush on fd=%d failed errno=%d (%s)\n",
c->c_fd, err, sock_errstr( err, ebuf, sizeof(ebuf) ) );
} else {
c->c_pendingber = NULL;
}
- ldap_pvt_thread_mutex_unlock( &c->c_io_mutex );
+ checked_unlock( &c->c_io_mutex );
done:
RELEASE_REF( c, c_refcnt, c->c_destroy );
do {
int rc;
- ldap_pvt_thread_mutex_unlock( cq_mutex );
+ checked_unlock( cq_mutex );
rc = cb( c, arg );
RELEASE_REF( c, c_refcnt, c->c_destroy );
- ldap_pvt_thread_mutex_lock( cq_mutex );
+ checked_lock( cq_mutex );
if ( rc || LDAP_CIRCLEQ_EMPTY( cq ) ) {
break;
}
return -1;
}
- ldap_pvt_thread_mutex_lock( &b->b_mutex );
+ checked_lock( &b->b_mutex );
b->b_retry_event = event;
backend_retry( b );
- ldap_pvt_thread_mutex_unlock( &b->b_mutex );
+ checked_unlock( &b->b_mutex );
}
}
/* Mark upstream connections closing and prevent from opening new ones */
LDAP_CIRCLEQ_FOREACH ( b, &backend, b_next ) {
- ldap_pvt_thread_mutex_lock( &b->b_mutex );
+ checked_lock( &b->b_mutex );
b->b_numconns = b->b_numbindconns = 0;
backend_reset( b, 1 );
- ldap_pvt_thread_mutex_unlock( &b->b_mutex );
+ checked_unlock( &b->b_mutex );
}
/* Do the same for clients */
if ( !current_backend ) {
current_backend = b;
}
- ldap_pvt_thread_mutex_lock( &b->b_mutex );
+ checked_lock( &b->b_mutex );
backend_retry( b );
- ldap_pvt_thread_mutex_unlock( &b->b_mutex );
+ checked_unlock( &b->b_mutex );
return;
} else if ( change->type == LLOAD_CHANGE_DEL ) {
ldap_pvt_thread_pool_walk(
&connection_pool, handle_pdus, backend_conn_cb, b );
ldap_pvt_thread_pool_walk(
&connection_pool, upstream_bind, backend_conn_cb, b );
- ldap_pvt_thread_mutex_lock( &b->b_mutex );
+ checked_lock( &b->b_mutex );
backend_reset( b, 0 );
backend_retry( b );
- ldap_pvt_thread_mutex_unlock( &b->b_mutex );
+ checked_unlock( &b->b_mutex );
return;
}
assert( need_close == 0 );
if ( need_open ) {
- ldap_pvt_thread_mutex_lock( &b->b_mutex );
+ checked_lock( &b->b_mutex );
backend_retry( b );
- ldap_pvt_thread_mutex_unlock( &b->b_mutex );
+ checked_unlock( &b->b_mutex );
}
}
}
&connection_pool, upstream_bind, backend_conn_cb, NULL );
LDAP_CIRCLEQ_FOREACH ( b, &backend, b_next ) {
- ldap_pvt_thread_mutex_lock( &b->b_mutex );
+ checked_lock( &b->b_mutex );
backend_reset( b, 0 );
backend_retry( b );
- ldap_pvt_thread_mutex_unlock( &b->b_mutex );
+ checked_unlock( &b->b_mutex );
}
/* Reconsider the PRIVILEGED flag on all clients */
*
* Do this in lockstep with the pausing thread.
*/
- ldap_pvt_thread_mutex_lock( &lload_wait_mutex );
+ checked_lock( &lload_wait_mutex );
ldap_pvt_thread_cond_signal( &lload_wait_cond );
/* Now wait until we unpause, then we can resume operation */
ldap_pvt_thread_cond_wait( &lload_pause_cond, &lload_wait_mutex );
- ldap_pvt_thread_mutex_unlock( &lload_wait_mutex );
+ checked_unlock( &lload_wait_mutex );
}
/*
{
int rc;
- ldap_pvt_thread_mutex_lock( &lload_wait_mutex );
+ checked_lock( &lload_wait_mutex );
event_base_once( base, -1, EV_TIMEOUT, lload_pause_event_cb, base, NULL );
rc = ldap_pvt_thread_cond_wait( &lload_wait_cond, &lload_wait_mutex );
- ldap_pvt_thread_mutex_unlock( &lload_wait_mutex );
+ checked_unlock( &lload_wait_mutex );
return rc;
}
* This means we can safely reconfigure both I/O events now.
*/
- ldap_pvt_thread_mutex_lock( &c->c_io_mutex );
+ checked_lock( &c->c_io_mutex );
output = c->c_pendingber;
if ( output == NULL && (output = ber_alloc()) == NULL ) {
- ldap_pvt_thread_mutex_unlock( &c->c_io_mutex );
+ checked_unlock( &c->c_io_mutex );
operation_unlink( op );
CONNECTION_LOCK_DESTROY(c);
return -1;
ber_printf( output, "t{tit{ess}}", LDAP_TAG_MESSAGE,
LDAP_TAG_MSGID, op->o_client_msgid,
LDAP_RES_EXTENDED, LDAP_SUCCESS, "", "" );
- ldap_pvt_thread_mutex_unlock( &c->c_io_mutex );
+ checked_unlock( &c->c_io_mutex );
CONNECTION_LOCK(c);
c->c_read_timeout = lload_timeout_net;
#include <epoch.h>
+#define checked_lock( mutex ) \
+ if ( ldap_pvt_thread_mutex_lock( mutex ) != 0 ) assert(0)
+#define checked_unlock( mutex ) \
+ if ( ldap_pvt_thread_mutex_unlock( mutex ) != 0 ) assert(0)
+
typedef struct LloadBackend LloadBackend;
typedef struct LloadPendingConnection LloadPendingConnection;
typedef struct LloadConnection LloadConnection;
CONNECTION_DESTROY_CB c_unlink;
CONNECTION_DESTROY_CB c_destroy;
CONNECTION_PDU_CB c_pdu_cb;
-#define CONNECTION_LOCK(c) ldap_pvt_thread_mutex_lock( &(c)->c_mutex )
-#define CONNECTION_UNLOCK(c) ldap_pvt_thread_mutex_unlock( &(c)->c_mutex )
+#define CONNECTION_LOCK(c) \
+ do { \
+ checked_lock( &(c)->c_mutex ); \
+ } while (0)
+#define CONNECTION_UNLOCK(c) \
+ do { \
+ checked_unlock( &(c)->c_mutex ); \
+ } while (0)
#define CONNECTION_UNLINK_(c) \
do { \
if ( __atomic_exchange_n( &(c)->c_live, 0, __ATOMIC_ACQ_REL ) ) { \
return 0;
}
- ldap_pvt_thread_mutex_lock( &lload_wait_mutex );
+ checked_lock( &lload_wait_mutex );
event_base_loopexit( daemon_base, NULL );
ldap_pvt_thread_cond_wait( &lload_wait_cond, &lload_wait_mutex );
- ldap_pvt_thread_mutex_unlock( &lload_wait_mutex );
+ checked_unlock( &lload_wait_mutex );
ldap_pvt_thread_join( lloadd_main_thread, (void *)NULL );
return 0;
mp_parent = e_parent->e_private;
arg.ms = (monitor_subsys_t *)mp_parent->mp_info;
- ldap_pvt_thread_mutex_lock( &clients_mutex );
+ checked_lock( &clients_mutex );
connections_walk(
&clients_mutex, &clients, lload_monitor_in_conn_entry, &arg );
- ldap_pvt_thread_mutex_unlock( &clients_mutex );
+ checked_unlock( &clients_mutex );
return 0;
}
arg.ms = ms;
- ldap_pvt_thread_mutex_lock( &b->b_mutex );
+ checked_lock( &b->b_mutex );
connections_walk_last( &b->b_mutex, &b->b_conns, b->b_last_conn,
lload_monitor_up_conn_entry, &arg );
connections_walk_last( &b->b_mutex, &b->b_bindconns, b->b_last_bindconn,
lload_monitor_up_conn_entry, &arg );
- ldap_pvt_thread_mutex_unlock( &b->b_mutex );
+ checked_unlock( &b->b_mutex );
return 0;
}
failed = 0;
int i;
- ldap_pvt_thread_mutex_lock( &b->b_mutex );
+ checked_lock( &b->b_mutex );
active = b->b_active + b->b_bindavail;
LDAP_CIRCLEQ_FOREACH ( c, &b->b_preparing, c_next ) {
assert( a != NULL );
UI2BV( &a->a_vals[0], (long long unsigned int)b->b_n_ops_executing );
- ldap_pvt_thread_mutex_unlock( &b->b_mutex );
+ checked_unlock( &b->b_mutex );
/* Right now, there is no way to retrieve the entry from monitor's
* cache to replace URI at the moment it is modified */
"updating stats\n" );
/* count incoming connections */
- ldap_pvt_thread_mutex_lock( &clients_mutex );
+ checked_lock( &clients_mutex );
connections_walk( &clients_mutex, &clients, lload_monitor_incoming_count,
&tmp_stats );
- ldap_pvt_thread_mutex_unlock( &clients_mutex );
+ checked_unlock( &clients_mutex );
LDAP_CIRCLEQ_FOREACH ( b, &backend, b_next ) {
- ldap_pvt_thread_mutex_lock( &b->b_mutex );
+ checked_lock( &b->b_mutex );
tmp_stats.global_outgoing += b->b_active + b->b_bindavail;
/* merge completed and failed stats */
tmp_stats.counters[i].lc_ops_failed +=
b->b_counters[i].lc_ops_failed;
}
- ldap_pvt_thread_mutex_unlock( &b->b_mutex );
+ checked_unlock( &b->b_mutex );
}
/* update lload_stats */
}
/* reschedule */
- ldap_pvt_thread_mutex_lock( &slapd_rq.rq_mutex );
+ checked_lock( &slapd_rq.rq_mutex );
ldap_pvt_runqueue_stoptask( &slapd_rq, rtask );
- ldap_pvt_thread_mutex_unlock( &slapd_rq.rq_mutex );
+ checked_unlock( &slapd_rq.rq_mutex );
return NULL;
}
}
}
- ldap_pvt_thread_mutex_lock( &slapd_rq.rq_mutex );
+ checked_lock( &slapd_rq.rq_mutex );
ldap_pvt_runqueue_insert( &slapd_rq, 1, lload_monitor_update_global_stats,
NULL, "lload_monitor_update_global_stats", "lloadd" );
- ldap_pvt_thread_mutex_unlock( &slapd_rq.rq_mutex );
+ checked_unlock( &slapd_rq.rq_mutex );
return (lload_monitor_initialized_failure = LDAP_SUCCESS);
}
"client msgid=%d\n",
op->o_client_connid, op->o_upstream_connid, op->o_client_msgid );
- ldap_pvt_thread_mutex_lock( &op->o_link_mutex );
+ checked_lock( &op->o_link_mutex );
client = op->o_client;
upstream = op->o_upstream;
op->o_client = NULL;
op->o_upstream = NULL;
- ldap_pvt_thread_mutex_unlock( &op->o_link_mutex );
+ checked_unlock( &op->o_link_mutex );
assert( client || upstream );
}
if ( b ) {
- ldap_pvt_thread_mutex_lock( &b->b_mutex );
+ checked_lock( &b->b_mutex );
b->b_n_ops_executing--;
operation_update_backend_counters( op, b );
- ldap_pvt_thread_mutex_unlock( &b->b_mutex );
+ checked_unlock( &b->b_mutex );
}
return result;
return rc;
}
- ldap_pvt_thread_mutex_lock( &upstream->c_io_mutex );
+ checked_lock( &upstream->c_io_mutex );
ber = upstream->c_pendingber;
if ( ber == NULL && (ber = ber_alloc()) == NULL ) {
Debug( LDAP_DEBUG_ANY, "operation_send_abandon: "
rc = LDAP_SUCCESS;
done:
- ldap_pvt_thread_mutex_unlock( &upstream->c_io_mutex );
+ checked_unlock( &upstream->c_io_mutex );
return rc;
}
{
LloadConnection *c;
- ldap_pvt_thread_mutex_lock( &op->o_link_mutex );
+ checked_lock( &op->o_link_mutex );
c = op->o_upstream;
- ldap_pvt_thread_mutex_unlock( &op->o_link_mutex );
+ checked_unlock( &op->o_link_mutex );
if ( !c || !IS_ALIVE( c, c_live ) ) {
goto done;
}
"rejecting %s from client connid=%lu with message: \"%s\"\n",
lload_msgtype2str( op->o_tag ), op->o_client_connid, msg );
- ldap_pvt_thread_mutex_lock( &op->o_link_mutex );
+ checked_lock( &op->o_link_mutex );
c = op->o_client;
- ldap_pvt_thread_mutex_unlock( &op->o_link_mutex );
+ checked_unlock( &op->o_link_mutex );
if ( !c || !IS_ALIVE( c, c_live ) ) {
Debug( LDAP_DEBUG_TRACE, "operation_send_reject: "
"not sending msgid=%d, client connid=%lu is dead\n",
goto done;
}
- ldap_pvt_thread_mutex_lock( &c->c_io_mutex );
+ checked_lock( &c->c_io_mutex );
ber = c->c_pendingber;
if ( ber == NULL && (ber = ber_alloc()) == NULL ) {
- ldap_pvt_thread_mutex_unlock( &c->c_io_mutex );
+ checked_unlock( &c->c_io_mutex );
Debug( LDAP_DEBUG_ANY, "operation_send_reject: "
"ber_alloc failed, closing connid=%lu\n",
c->c_connid );
LDAP_TAG_MSGID, op->o_client_msgid,
slap_req2res( op->o_tag ), result, "", msg );
- ldap_pvt_thread_mutex_unlock( &c->c_io_mutex );
+ checked_unlock( &c->c_io_mutex );
connection_write_cb( -1, 0, c );
nops, upstream->c_connid );
CONNECTION_UNLOCK(upstream);
- ldap_pvt_thread_mutex_lock( &b->b_mutex );
+ checked_lock( &b->b_mutex );
b->b_n_ops_executing -= nops;
- ldap_pvt_thread_mutex_unlock( &b->b_mutex );
+ checked_unlock( &b->b_mutex );
for ( node = tavl_end( ops, TAVL_DIR_LEFT ); node;
node = tavl_next( node, TAVL_DIR_RIGHT ) ) {
LDAP_CIRCLEQ_FOREACH ( b, &backend, b_next ) {
epoch_t epoch;
- ldap_pvt_thread_mutex_lock( &b->b_mutex );
+ checked_lock( &b->b_mutex );
if ( b->b_n_ops_executing == 0 ) {
- ldap_pvt_thread_mutex_unlock( &b->b_mutex );
+ checked_unlock( &b->b_mutex );
continue;
}
connection_timeout, &threshold );
epoch_leave( epoch );
- ldap_pvt_thread_mutex_unlock( &b->b_mutex );
+ checked_unlock( &b->b_mutex );
}
done:
Debug( LDAP_DEBUG_TRACE, "operations_timeout: "
"%s to client connid=%lu request msgid=%d\n",
lload_msgtype2str( response_tag ), op->o_client_connid, msgid );
- ldap_pvt_thread_mutex_lock( &client->c_io_mutex );
+ checked_lock( &client->c_io_mutex );
output = client->c_pendingber;
if ( output == NULL && (output = ber_alloc()) == NULL ) {
ber_free( ber, 1 );
- ldap_pvt_thread_mutex_unlock( &client->c_io_mutex );
+ checked_unlock( &client->c_io_mutex );
return -1;
}
client->c_pendingber = output;
response_tag, &response,
LDAP_TAG_CONTROLS, BER_BV_OPTIONAL( &controls ) );
- ldap_pvt_thread_mutex_unlock( &client->c_io_mutex );
+ checked_unlock( &client->c_io_mutex );
ber_free( ber, 1 );
connection_write_cb( -1, 0, client );
if ( handler ) {
LloadConnection *client;
- ldap_pvt_thread_mutex_lock( &op->o_link_mutex );
+ checked_lock( &op->o_link_mutex );
client = op->o_client;
- ldap_pvt_thread_mutex_unlock( &op->o_link_mutex );
+ checked_unlock( &op->o_link_mutex );
if ( client && IS_ALIVE( client, c_live ) ) {
rc = handler( client, op, ber );
} else {
if ( result == LDAP_SASL_BIND_IN_PROGRESS ) {
BerElement *outber;
- ldap_pvt_thread_mutex_lock( &c->c_io_mutex );
+ checked_lock( &c->c_io_mutex );
outber = c->c_pendingber;
if ( outber == NULL && (outber = ber_alloc()) == NULL ) {
- ldap_pvt_thread_mutex_unlock( &c->c_io_mutex );
+ checked_unlock( &c->c_io_mutex );
goto fail;
}
c->c_pendingber = outber;
msgid, LDAP_REQ_BIND, LDAP_VERSION3,
&bindconf.sb_binddn, LDAP_AUTH_SASL,
&c->c_sasl_bind_mech, BER_BV_OPTIONAL( &ccred ) );
- ldap_pvt_thread_mutex_unlock( &c->c_io_mutex );
+ checked_unlock( &c->c_io_mutex );
connection_write_cb( -1, 0, c );
"connid=%lu finished binding, now active\n",
c->c_connid );
CONNECTION_UNLOCK(c);
- ldap_pvt_thread_mutex_lock( &b->b_mutex );
+ checked_lock( &b->b_mutex );
LDAP_CIRCLEQ_REMOVE( &b->b_preparing, c, c_next );
b->b_active++;
b->b_opening--;
}
b->b_last_conn = c;
backend_retry( b );
- ldap_pvt_thread_mutex_unlock( &b->b_mutex );
+ checked_unlock( &b->b_mutex );
break;
default:
Debug( LDAP_DEBUG_ANY, "upstream_bind_cb: "
c->c_pdu_cb = upstream_bind_cb;
CONNECTION_UNLOCK(c);
- ldap_pvt_thread_mutex_lock( &c->c_io_mutex );
+ checked_lock( &c->c_io_mutex );
ber = c->c_pendingber;
if ( ber == NULL && (ber = ber_alloc()) == NULL ) {
goto fail;
}
#endif /* HAVE_CYRUS_SASL */
}
- ldap_pvt_thread_mutex_unlock( &c->c_io_mutex );
+ checked_unlock( &c->c_io_mutex );
connection_write_cb( -1, 0, c );
return NULL;
fail:
- ldap_pvt_thread_mutex_unlock( &c->c_io_mutex );
+ checked_unlock( &c->c_io_mutex );
CONNECTION_LOCK_DESTROY(c);
RELEASE_REF( c, c_refcnt, c->c_destroy );
return NULL;
c->c_is_tls = LLOAD_TLS_ESTABLISHED;
CONNECTION_UNLOCK(c);
- ldap_pvt_thread_mutex_lock( &b->b_mutex );
+ checked_lock( &b->b_mutex );
CONNECTION_LOCK(c);
rc = upstream_finish( c );
- ldap_pvt_thread_mutex_unlock( &b->b_mutex );
+ checked_unlock( &b->b_mutex );
if ( rc ) {
goto fail;
c->c_is_tls = LLOAD_CLEARTEXT;
CONNECTION_UNLOCK(c);
- ldap_pvt_thread_mutex_lock( &b->b_mutex );
+ checked_lock( &b->b_mutex );
CONNECTION_LOCK(c);
rc = upstream_finish( c );
- ldap_pvt_thread_mutex_unlock( &b->b_mutex );
+ checked_unlock( &b->b_mutex );
if ( rc ) {
goto fail;
c->c_is_tls == LLOAD_STARTTLS_OPTIONAL ) {
BerElement *output;
- ldap_pvt_thread_mutex_lock( &c->c_io_mutex );
+ checked_lock( &c->c_io_mutex );
if ( (output = c->c_pendingber = ber_alloc()) == NULL ) {
- ldap_pvt_thread_mutex_unlock( &c->c_io_mutex );
+ checked_unlock( &c->c_io_mutex );
goto fail;
}
ber_printf( output, "t{tit{ts}}", LDAP_TAG_MESSAGE,
LDAP_TAG_MSGID, c->c_next_msgid++,
LDAP_REQ_EXTENDED,
LDAP_TAG_EXOP_REQ_OID, LDAP_EXOP_START_TLS );
- ldap_pvt_thread_mutex_unlock( &c->c_io_mutex );
+ checked_unlock( &c->c_io_mutex );
c->c_pdu_cb = upstream_starttls;
CONNECTION_UNLOCK(c);
event_del( write_event );
}
- ldap_pvt_thread_mutex_lock( &b->b_mutex );
+ checked_lock( &b->b_mutex );
if ( c->c_type == LLOAD_C_PREPARING ) {
LDAP_CIRCLEQ_REMOVE( &b->b_preparing, c, c_next );
b->b_opening--;
}
b->b_n_ops_executing -= executing;
backend_retry( b );
- ldap_pvt_thread_mutex_unlock( &b->b_mutex );
+ checked_unlock( &b->b_mutex );
CONNECTION_LOCK(c);
}