]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/connection.c
- setup framework for monitoring of back-bdb/back-hdb stuff in their
[openldap] / servers / slapd / connection.c
index ea21b7379bcdbe7c455688ea84e25b440735c3be..367ddf209eb0aacec61ffc425de09f5a8f3f740f 100644 (file)
@@ -857,16 +857,15 @@ connection_close( Connection *c )
                ber_sockbuf_ctrl( c->c_sb, LBER_SB_OPT_GET_FD, &sd );
        }
 
-       if ( !LDAP_STAILQ_EMPTY(&c->c_ops) ) {
+       if ( !LDAP_STAILQ_EMPTY(&c->c_ops) ||
+               !LDAP_STAILQ_EMPTY(&c->c_pending_ops) )
+       {
                Debug( LDAP_DEBUG_TRACE,
                        "connection_close: deferring conn=%lu sd=%d\n",
                        c->c_connid, sd, 0 );
                return;
        }
 
-       /* NOTE: if there's no pending ops, writewaiter must be 0 (ITS#4659) */
-       assert( c->c_writewaiter == 0 );
-
        Debug( LDAP_DEBUG_TRACE, "connection_close: conn=%lu sd=%d\n",
                c->c_connid, sd, 0 );
 
@@ -1007,7 +1006,7 @@ connection_operation( void *ctx, void *arg_v )
        Operation *op = arg_v;
        SlapReply rs = {REP_RESULT};
        ber_tag_t tag = op->o_tag;
-       int opidx = -1;
+       slap_op_t opidx = SLAP_OP_LAST;
        Connection *conn = op->o_conn;
        void *memctx = NULL;
        void *memctx_null = NULL;
@@ -1090,53 +1089,8 @@ connection_operation( void *ctx, void *arg_v )
        }
        }
 
-       switch ( tag ) {
-       case LDAP_REQ_BIND:
-               opidx = SLAP_OP_BIND;
-               break;
-
-       case LDAP_REQ_UNBIND:
-               opidx = SLAP_OP_UNBIND;
-               break;
-
-       case LDAP_REQ_ADD:
-               opidx = SLAP_OP_ADD;
-               break;
-
-       case LDAP_REQ_DELETE:
-               opidx = SLAP_OP_DELETE;
-               break;
-
-       case LDAP_REQ_MODRDN:
-               opidx = SLAP_OP_MODRDN;
-               break;
-
-       case LDAP_REQ_MODIFY:
-               opidx = SLAP_OP_MODIFY;
-               break;
-
-       case LDAP_REQ_COMPARE:
-               opidx = SLAP_OP_COMPARE;
-               break;
-
-       case LDAP_REQ_SEARCH:
-               opidx = SLAP_OP_SEARCH;
-               break;
-
-       case LDAP_REQ_ABANDON:
-               opidx = SLAP_OP_ABANDON;
-               break;
-
-       case LDAP_REQ_EXTENDED:
-               opidx = SLAP_OP_EXTENDED;
-               break;
-
-       default:
-               /* not reachable */
-               assert( 0 );
-       }
-
-       assert( opidx > -1 );
+       opidx = slap_req2op( tag );
+       assert( opidx != SLAP_OP_LAST );
        INCR_OP_INITIATED( opidx );
        rc = (*(opfun[opidx]))( op, &rs );
 
@@ -1144,7 +1098,7 @@ operations_error:
        if ( rc == SLAPD_DISCONNECT ) {
                tag = LBER_ERROR;
 
-       } else if ( opidx > -1 ) {
+       } else if ( opidx != SLAP_OP_LAST ) {
                /* increment completed operations count 
                 * only if operation was initiated
                 * and rc != SLAPD_DISCONNECT */
@@ -1158,6 +1112,7 @@ operations_error:
                        op->o_cancel = LDAP_TOO_LATE;
                }
        }
+
        while ( op->o_cancel != SLAP_CANCEL_NONE &&
                op->o_cancel != SLAP_CANCEL_DONE )
        {