mirror of
https://git.openldap.org/openldap/openldap.git
synced 2025-12-22 07:39:35 -05:00
ITS#5836, #6089 fix c_writers counting
This commit is contained in:
parent
8a0b05bfeb
commit
1ca5fe851f
2 changed files with 22 additions and 13 deletions
|
|
@ -139,40 +139,46 @@ static long send_ldap_ber(
|
||||||
Connection *conn = op->o_conn;
|
Connection *conn = op->o_conn;
|
||||||
ber_len_t bytes;
|
ber_len_t bytes;
|
||||||
long ret = 0;
|
long ret = 0;
|
||||||
int closing = 0;
|
|
||||||
|
|
||||||
ber_get_option( ber, LBER_OPT_BER_BYTES_TO_WRITE, &bytes );
|
ber_get_option( ber, LBER_OPT_BER_BYTES_TO_WRITE, &bytes );
|
||||||
|
|
||||||
/* write only one pdu at a time - wait til it's our turn */
|
/* write only one pdu at a time - wait til it's our turn */
|
||||||
ldap_pvt_thread_mutex_lock( &conn->c_write1_mutex );
|
ldap_pvt_thread_mutex_lock( &conn->c_write1_mutex );
|
||||||
if (( op->o_abandon && !op->o_cancel ) || !connection_valid( conn )) {
|
if (( op->o_abandon && !op->o_cancel ) || !connection_valid( conn ) ||
|
||||||
|
conn->c_writers < 0 ) {
|
||||||
ldap_pvt_thread_mutex_unlock( &conn->c_write1_mutex );
|
ldap_pvt_thread_mutex_unlock( &conn->c_write1_mutex );
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
while ( conn->c_writers > 0 ) {
|
|
||||||
ldap_pvt_thread_cond_wait( &conn->c_write1_cv, &conn->c_write1_mutex );
|
|
||||||
}
|
|
||||||
/* connection was closed under us */
|
|
||||||
if ( conn->c_writers < 0 ) {
|
|
||||||
closing = 1;
|
|
||||||
/* we're the last waiter, let the closer continue */
|
|
||||||
if ( conn->c_writers == -1 )
|
|
||||||
ldap_pvt_thread_cond_signal( &conn->c_write1_cv );
|
|
||||||
}
|
|
||||||
|
|
||||||
conn->c_writers++;
|
conn->c_writers++;
|
||||||
|
|
||||||
if ( closing ) {
|
while ( conn->c_writers > 0 && conn->c_writing ) {
|
||||||
|
ldap_pvt_thread_cond_wait( &conn->c_write1_cv, &conn->c_write1_mutex );
|
||||||
|
}
|
||||||
|
|
||||||
|
/* connection was closed under us */
|
||||||
|
if ( conn->c_writers < 0 ) {
|
||||||
|
/* we're the last waiter, let the closer continue */
|
||||||
|
if ( conn->c_writers == -1 )
|
||||||
|
ldap_pvt_thread_cond_signal( &conn->c_write1_cv );
|
||||||
|
conn->c_writers++;
|
||||||
ldap_pvt_thread_mutex_unlock( &conn->c_write1_mutex );
|
ldap_pvt_thread_mutex_unlock( &conn->c_write1_mutex );
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Our turn */
|
||||||
|
conn->c_writing = 1;
|
||||||
|
|
||||||
/* write the pdu */
|
/* write the pdu */
|
||||||
while( 1 ) {
|
while( 1 ) {
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
/* lock the connection */
|
/* lock the connection */
|
||||||
if ( ldap_pvt_thread_mutex_trylock( &conn->c_mutex )) {
|
if ( ldap_pvt_thread_mutex_trylock( &conn->c_mutex )) {
|
||||||
|
if ( !connection_valid(conn)) {
|
||||||
|
ret = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
ldap_pvt_thread_mutex_unlock( &conn->c_write1_mutex );
|
ldap_pvt_thread_mutex_unlock( &conn->c_write1_mutex );
|
||||||
ldap_pvt_thread_mutex_lock( &conn->c_write1_mutex );
|
ldap_pvt_thread_mutex_lock( &conn->c_write1_mutex );
|
||||||
if ( conn->c_writers < 0 ) {
|
if ( conn->c_writers < 0 ) {
|
||||||
|
|
@ -201,6 +207,7 @@ static long send_ldap_ber(
|
||||||
|
|
||||||
if ( err != EWOULDBLOCK && err != EAGAIN ) {
|
if ( err != EWOULDBLOCK && err != EAGAIN ) {
|
||||||
conn->c_writers--;
|
conn->c_writers--;
|
||||||
|
conn->c_writing = 0;
|
||||||
ldap_pvt_thread_mutex_unlock( &conn->c_write1_mutex );
|
ldap_pvt_thread_mutex_unlock( &conn->c_write1_mutex );
|
||||||
connection_closing( conn, "connection lost on write" );
|
connection_closing( conn, "connection lost on write" );
|
||||||
|
|
||||||
|
|
@ -225,6 +232,7 @@ static long send_ldap_ber(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
conn->c_writing = 0;
|
||||||
if ( conn->c_writers < 0 ) {
|
if ( conn->c_writers < 0 ) {
|
||||||
conn->c_writers++;
|
conn->c_writers++;
|
||||||
if ( !conn->c_writers )
|
if ( !conn->c_writers )
|
||||||
|
|
|
||||||
|
|
@ -2809,6 +2809,7 @@ struct Connection {
|
||||||
|
|
||||||
BerElement *c_currentber; /* ber we're attempting to read */
|
BerElement *c_currentber; /* ber we're attempting to read */
|
||||||
int c_writers; /* number of writers waiting */
|
int c_writers; /* number of writers waiting */
|
||||||
|
char c_writing; /* someone is writing */
|
||||||
|
|
||||||
char c_sasl_bind_in_progress; /* multi-op bind in progress */
|
char c_sasl_bind_in_progress; /* multi-op bind in progress */
|
||||||
char c_writewaiter; /* true if blocked on write */
|
char c_writewaiter; /* true if blocked on write */
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue