Browse Source

Ticket: 48341 - deadlock on connection mutex

If  thread is blocked in connection_read_operation() it holds the connection mutex
and the main thread iterating through the connection table is also blocked.

But if the main thread would get the mutex it would just detect that the connection has still the
C_gettingber flag set and immediately release the lock.

The check if c_gettingber == 0 can be done without holding the mutex and so the deadlock
can be avoided

Reviewed by Rich, Thanks
Ludwig Krispenz 10 years ago
parent
commit
d73b5738fb
1 changed files with 3 additions and 0 deletions
  1. 3 0
      ldap/servers/slapd/daemon.c

+ 3 - 0
ldap/servers/slapd/daemon.c

@@ -1752,6 +1752,9 @@ handle_pr_read_ready(Connection_Table *ct, PRIntn num_poll)
 	{
 		if ( c->c_mutex != NULL )
 		{
+			/* this check can be done without acquiring the mutex */
+			if (c->c_gettingber) continue;
+
 			PR_EnterMonitor(c->c_mutex);
 			if ( connection_is_active_nolock (c) && c->c_gettingber == 0 )
 			{