c = connection_get( s );
        c->c_clientfunc = func;
        c->c_clientarg = arg;
-       connection_return( c );
+
        slapd_add_internal( s, 0 );
        slapd_set_read( s, 1 );
+       connection_return( c );
        return 0;
 }
 
                ber_sockbuf_ctrl( c->c_sb, LBER_SB_OPT_SET_MAX_INCOMING, &max );
        }
 
-       connection_return( c );
        slapd_remove( s, 0, 1 );
+       connection_return( c );
 }
 
 #ifdef SLAP_LIGHTWEIGHT_DISPATCHER
                Debug( LDAP_DEBUG_TRACE,
                        "connection_read(%d): closing, ignoring input for id=%lu\n",
                        s, c->c_connid, 0 );
-               connection_return( c );
-               ldap_pvt_thread_mutex_unlock( MCA_GET_CONN_MUTEX(s) );
 
 #ifdef SLAP_LIGHTWEIGHT_DISPATCHER
-               slapd_set_read( s, 1);
+               slapd_set_read( s, 1 );
 #endif
+               connection_return( c );
+               ldap_pvt_thread_mutex_unlock( MCA_GET_CONN_MUTEX(s) );
                return 0;
        }
 
                if( rc != 0 ||
                        !ber_sockbuf_ctrl( c->c_sb, LBER_SB_OPT_DATA_READY, NULL ) )
                {
-                       connection_return( c );
-                       ldap_pvt_thread_mutex_unlock( MCA_GET_CONN_MUTEX(s) );
-
 #ifdef SLAP_LIGHTWEIGHT_DISPATCHER
                        slapd_set_read( s, 1 );
 #endif
+
+                       connection_return( c );
+                       ldap_pvt_thread_mutex_unlock( MCA_GET_CONN_MUTEX(s) );
                        return 0;
                }
        }
        if ( c->c_sasl_layers ) {
                /* If previous layer is not removed yet, give up for now */
                if ( !c->c_sasl_sockctx ) {
-                       connection_return( c );
-                       ldap_pvt_thread_mutex_unlock( MCA_GET_CONN_MUTEX(s) );
-
 #ifdef SLAP_LIGHTWEIGHT_DISPATCHER
                        slapd_set_read( s, 1 );
 #endif
+
+                       connection_return( c );
+                       ldap_pvt_thread_mutex_unlock( MCA_GET_CONN_MUTEX(s) );
                        return 0;
                }
 
 
                break;
        }
-       connection_return( c );
 
+       connection_return( c );
        ldap_pvt_thread_mutex_unlock( MCA_GET_CONN_MUTEX(s) );
-
        return 0;
 }