]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/result.c
Fix compare op
[openldap] / servers / slapd / result.c
index 8bb8417921066109f54eda6f458ca919bc42969b..0756260de04ab20c39dbb424b25379e2748c2ef1 100644 (file)
@@ -2,7 +2,7 @@
 /* $OpenLDAP$ */
 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
  *
- * Copyright 1998-2008 The OpenLDAP Foundation.
+ * Copyright 1998-2009 The OpenLDAP Foundation.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -137,27 +137,53 @@ static long send_ldap_ber(
        BerElement *ber )
 {
        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_write_mutex );
+       ldap_pvt_thread_mutex_lock( &conn->c_write1_mutex );
+       if ( connection_state_closing( conn )) {
+               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 );
+       }
 
-       /* lock the connection */ 
-       ldap_pvt_thread_mutex_lock( &conn->c_mutex );
+       conn->c_writers++;
+
+       if ( closing ) {
+               ldap_pvt_thread_mutex_unlock( &conn->c_write1_mutex );
+               return 0;
+       }
 
        /* write the pdu */
        while( 1 ) {
                int err;
 
-               if ( connection_state_closing( conn ) ) {
-                       ldap_pvt_thread_mutex_unlock( &conn->c_mutex );
-                       ldap_pvt_thread_mutex_unlock( &conn->c_write_mutex );
-
-                       return 0;
+               /* lock the connection */ 
+               if ( ldap_pvt_thread_mutex_trylock( &conn->c_mutex )) {
+                       ldap_pvt_thread_mutex_unlock( &conn->c_write1_mutex );
+                       ldap_pvt_thread_mutex_lock( &conn->c_write1_mutex );
+                       if ( conn->c_writers < 0 ) {
+                               ret = 0;
+                               break;
+                       }
+                       continue;
                }
 
                if ( ber_flush2( conn->c_sb, ber, LBER_FLUSH_FREE_NEVER ) == 0 ) {
+                       ldap_pvt_thread_mutex_unlock( &conn->c_mutex );
+                       ret = bytes;
                        break;
                }
 
@@ -173,26 +199,42 @@ static long send_ldap_ber(
                    err, sock_errstr(err), 0 );
 
                if ( err != EWOULDBLOCK && err != EAGAIN ) {
+                       conn->c_writers--;
+                       ldap_pvt_thread_mutex_unlock( &conn->c_write1_mutex );
                        connection_closing( conn, "connection lost on write" );
 
                        ldap_pvt_thread_mutex_unlock( &conn->c_mutex );
-                       ldap_pvt_thread_mutex_unlock( &conn->c_write_mutex );
-
-                       return( -1 );
+                       return -1;
                }
 
                /* wait for socket to be write-ready */
+               ldap_pvt_thread_mutex_lock( &conn->c_write2_mutex );
                conn->c_writewaiter = 1;
                slapd_set_write( conn->c_sd, 1 );
 
-               ldap_pvt_thread_cond_wait( &conn->c_write_cv, &conn->c_mutex );
+               ldap_pvt_thread_mutex_unlock( &conn->c_write1_mutex );
+               ldap_pvt_thread_mutex_unlock( &conn->c_mutex );
+               ldap_pvt_thread_cond_wait( &conn->c_write2_cv, &conn->c_write2_mutex );
                conn->c_writewaiter = 0;
+               ldap_pvt_thread_mutex_unlock( &conn->c_write2_mutex );
+               ldap_pvt_thread_mutex_lock( &conn->c_write1_mutex );
+               if ( conn->c_writers < 0 ) {
+                       ret = 0;
+                       break;
+               }
        }
 
-       ldap_pvt_thread_mutex_unlock( &conn->c_mutex );
-       ldap_pvt_thread_mutex_unlock( &conn->c_write_mutex );
+       if ( conn->c_writers < 0 ) {
+               conn->c_writers++;
+               if ( !conn->c_writers )
+                       ldap_pvt_thread_cond_signal( &conn->c_write1_cv );
+       } else {
+               conn->c_writers--;
+               ldap_pvt_thread_cond_signal( &conn->c_write1_cv );
+       }
+       ldap_pvt_thread_mutex_unlock( &conn->c_write1_mutex );
 
-       return bytes;
+       return ret;
 }
 
 static int
@@ -649,14 +691,10 @@ abandon:
 
        if ( send_ldap_response( op, rs ) == SLAP_CB_CONTINUE ) {
                if ( op->o_tag == LDAP_REQ_SEARCH ) {
-                       char nbuf[64];
-                       snprintf( nbuf, sizeof nbuf, "%d nentries=%d",
-                               rs->sr_err, rs->sr_nentries );
-
                        Statslog( LDAP_DEBUG_STATS,
-                       "%s SEARCH RESULT tag=%lu err=%s text=%s\n",
-                               op->o_log_prefix, rs->sr_tag, nbuf,
-                               rs->sr_text ? rs->sr_text : "", 0 );
+                               "%s SEARCH RESULT tag=%lu err=%d nentries=%d text=%s\n",
+                               op->o_log_prefix, rs->sr_tag, rs->sr_err,
+                               rs->sr_nentries, rs->sr_text ? rs->sr_text : "" );
                } else {
                        Statslog( LDAP_DEBUG_STATS,
                                "%s RESULT tag=%lu err=%d text=%s\n",
@@ -1618,9 +1656,9 @@ slap_attr_flags( AttributeName *an )
                flags |= ( SLAP_OPATTRS_NO | SLAP_USERATTRS_YES );
 
        } else {
-               flags |= an_find( an, &AllOper )
+               flags |= an_find( an, slap_bv_all_operational_attrs )
                        ? SLAP_OPATTRS_YES : SLAP_OPATTRS_NO;
-               flags |= an_find( an, &AllUser )
+               flags |= an_find( an, slap_bv_all_user_attrs )
                        ? SLAP_USERATTRS_YES : SLAP_USERATTRS_NO;
        }