Commit b0fdc08e authored by Howard Chu's avatar Howard Chu
Browse files

ITS#6276 wake up blocked writers if we're pausing

parent 7190a68f
...@@ -753,6 +753,32 @@ static void connection_abandon( Connection *c ) ...@@ -753,6 +753,32 @@ static void connection_abandon( Connection *c )
} }
} }
static void
connection_wake_writers( Connection *c )
{
/* wake write blocked operations */
ldap_pvt_thread_mutex_lock( &c->c_write1_mutex );
if ( c->c_writers > 0 ) {
c->c_writers = -c->c_writers;
ldap_pvt_thread_cond_broadcast( &c->c_write1_cv );
ldap_pvt_thread_mutex_unlock( &c->c_write1_mutex );
if ( c->c_writewaiter ) {
ldap_pvt_thread_mutex_lock( &c->c_write2_mutex );
ldap_pvt_thread_cond_signal( &c->c_write2_cv );
slapd_clr_write( c->c_sd, 1 );
ldap_pvt_thread_mutex_unlock( &c->c_write2_mutex );
}
ldap_pvt_thread_mutex_lock( &c->c_write1_mutex );
while ( c->c_writers ) {
ldap_pvt_thread_cond_wait( &c->c_write1_cv, &c->c_write1_mutex );
}
ldap_pvt_thread_mutex_unlock( &c->c_write1_mutex );
} else {
ldap_pvt_thread_mutex_unlock( &c->c_write1_mutex );
slapd_clr_write( c->c_sd, 1 );
}
}
void connection_closing( Connection *c, const char *why ) void connection_closing( Connection *c, const char *why )
{ {
assert( connections != NULL ); assert( connections != NULL );
...@@ -777,26 +803,7 @@ void connection_closing( Connection *c, const char *why ) ...@@ -777,26 +803,7 @@ void connection_closing( Connection *c, const char *why )
connection_abandon( c ); connection_abandon( c );
/* wake write blocked operations */ /* wake write blocked operations */
ldap_pvt_thread_mutex_lock( &c->c_write1_mutex ); connection_wake_writers( c );
if ( c->c_writers > 0 ) {
c->c_writers = -c->c_writers;
ldap_pvt_thread_cond_broadcast( &c->c_write1_cv );
ldap_pvt_thread_mutex_unlock( &c->c_write1_mutex );
if ( c->c_writewaiter ) {
ldap_pvt_thread_mutex_lock( &c->c_write2_mutex );
ldap_pvt_thread_cond_signal( &c->c_write2_cv );
slapd_clr_write( c->c_sd, 1 );
ldap_pvt_thread_mutex_unlock( &c->c_write2_mutex );
}
ldap_pvt_thread_mutex_lock( &c->c_write1_mutex );
while ( c->c_writers ) {
ldap_pvt_thread_cond_wait( &c->c_write1_cv, &c->c_write1_mutex );
}
ldap_pvt_thread_mutex_unlock( &c->c_write1_mutex );
} else {
ldap_pvt_thread_mutex_unlock( &c->c_write1_mutex );
slapd_clr_write( c->c_sd, 1 );
}
} else if( why == NULL && c->c_close_reason == conn_lost_str ) { } else if( why == NULL && c->c_close_reason == conn_lost_str ) {
/* Client closed connection after doing Unbind. */ /* Client closed connection after doing Unbind. */
...@@ -1270,6 +1277,11 @@ int connection_read_activate( ber_socket_t s ) ...@@ -1270,6 +1277,11 @@ int connection_read_activate( ber_socket_t s )
if ( rc ) if ( rc )
return rc; return rc;
/* Don't let blocked writers block a pause request */
if ( connections[s].c_writewaiter &&
ldap_pvt_thread_pool_pausing( &connection_pool ))
connection_wake_writers( &connections[s] );
rc = ldap_pvt_thread_pool_submit( &connection_pool, rc = ldap_pvt_thread_pool_submit( &connection_pool,
connection_read_thread, (void *)(long)s ); connection_read_thread, (void *)(long)s );
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment