]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/slapi/slapi_ops.c
Merge remote branch 'origin/mdb.master'
[openldap] / servers / slapd / slapi / slapi_ops.c
index fe1d2474c6a76f3c7491b99915daaebd8e8fa2e6..19f41961afb2ee1fbf7b8b0b3110e7e39cb34e45 100644 (file)
@@ -1,7 +1,7 @@
 /* $OpenLDAP$ */
 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
  *
- * Copyright 2002-2007 The OpenLDAP Foundation.
+ * Copyright 2002-2012 The OpenLDAP Foundation.
  * Portions Copyright 1997,2002-2003 IBM Corporation.
  * All rights reserved.
  *
@@ -33,7 +33,7 @@
 
 #ifdef LDAP_SLAPI
 
-static struct slap_listener slapi_listener = {
+static struct Listener slapi_listener = {
        BER_BVC("slapi://"),
        BER_BVC("slapi://")
 };
@@ -224,8 +224,10 @@ slapi_int_connection_init_pb( Slapi_PBlock *pb, ber_tag_t tag )
 
        /* should check status of thread calls */
        ldap_pvt_thread_mutex_init( &conn->c_mutex );
-       ldap_pvt_thread_mutex_init( &conn->c_write_mutex );
-       ldap_pvt_thread_cond_init( &conn->c_write_cv );
+       ldap_pvt_thread_mutex_init( &conn->c_write1_mutex );
+       ldap_pvt_thread_mutex_init( &conn->c_write2_mutex );
+       ldap_pvt_thread_cond_init( &conn->c_write1_cv );
+       ldap_pvt_thread_cond_init( &conn->c_write2_cv );
 
        ldap_pvt_thread_mutex_lock( &conn->c_mutex );
 
@@ -419,6 +421,8 @@ slapi_add_internal_pb( Slapi_PBlock *pb )
 {
        SlapReply               *rs;
        Slapi_Entry             *entry_orig = NULL;
+       OpExtraDB oex;
+       int rc;
 
        if ( pb == NULL ) {
                return -1;
@@ -478,16 +482,20 @@ slapi_add_internal_pb( Slapi_PBlock *pb )
                goto cleanup;
        }
 
-       if ( slapi_int_func_internal_pb( pb, op_add ) == 0 ) {
-               if ( pb->pb_op->ora_e != NULL && pb->pb_op->o_private != NULL ) {
+       oex.oe.oe_key = (void *)do_add;
+       oex.oe_db = NULL;
+       LDAP_SLIST_INSERT_HEAD(&pb->pb_op->o_extra, &oex.oe, oe_next);
+       rc = slapi_int_func_internal_pb( pb, op_add );
+       LDAP_SLIST_REMOVE(&pb->pb_op->o_extra, &oex.oe, OpExtra, oe_next);
+
+       if ( !rc ) {
+               if ( pb->pb_op->ora_e != NULL && oex.oe_db != NULL ) {
                        BackendDB       *bd = pb->pb_op->o_bd;
 
-                       pb->pb_op->o_bd = (BackendDB *)pb->pb_op->o_private;
-                       pb->pb_op->o_private = NULL;
+                       pb->pb_op->o_bd = oex.oe_db;
                        be_entry_release_w( pb->pb_op, pb->pb_op->ora_e );
                        pb->pb_op->ora_e = NULL;
                        pb->pb_op->o_bd = bd;
-                       pb->pb_op->o_private = NULL;
                }
        }