mirror of
https://git.openldap.org/openldap/openldap.git
synced 2025-03-07 14:18:15 +08:00
ITS#5836, #6089 fix c_writers counting
This commit is contained in:
parent
8a0b05bfeb
commit
1ca5fe851f
@ -139,40 +139,46 @@ static long send_ldap_ber(
|
||||
Connection *conn = op->o_conn;
|
||||
ber_len_t bytes;
|
||||
long ret = 0;
|
||||
int closing = 0;
|
||||
|
||||
ber_get_option( ber, LBER_OPT_BER_BYTES_TO_WRITE, &bytes );
|
||||
|
||||
/* write only one pdu at a time - wait til it's our turn */
|
||||
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 );
|
||||
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++;
|
||||
|
||||
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 );
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Our turn */
|
||||
conn->c_writing = 1;
|
||||
|
||||
/* write the pdu */
|
||||
while( 1 ) {
|
||||
int err;
|
||||
|
||||
/* lock the connection */
|
||||
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_lock( &conn->c_write1_mutex );
|
||||
if ( conn->c_writers < 0 ) {
|
||||
@ -201,6 +207,7 @@ static long send_ldap_ber(
|
||||
|
||||
if ( err != EWOULDBLOCK && err != EAGAIN ) {
|
||||
conn->c_writers--;
|
||||
conn->c_writing = 0;
|
||||
ldap_pvt_thread_mutex_unlock( &conn->c_write1_mutex );
|
||||
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 ) {
|
||||
conn->c_writers++;
|
||||
if ( !conn->c_writers )
|
||||
|
@ -2809,6 +2809,7 @@ struct Connection {
|
||||
|
||||
BerElement *c_currentber; /* ber we're attempting to read */
|
||||
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_writewaiter; /* true if blocked on write */
|
||||
|
Loading…
Reference in New Issue
Block a user