X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fslapd%2Fslapi%2Fslapi_ops.c;h=19f41961afb2ee1fbf7b8b0b3110e7e39cb34e45;hb=d2da9c1a7d1480eb6b8ae8c2a8e78392f44f4289;hp=fe1d2474c6a76f3c7491b99915daaebd8e8fa2e6;hpb=88cbe052e079d3a4ee0848e2442fd92821744a30;p=openldap diff --git a/servers/slapd/slapi/slapi_ops.c b/servers/slapd/slapi/slapi_ops.c index fe1d2474c6..19f41961af 100644 --- a/servers/slapd/slapi/slapi_ops.c +++ b/servers/slapd/slapi/slapi_ops.c @@ -1,7 +1,7 @@ /* $OpenLDAP$ */ /* This work is part of OpenLDAP Software . * - * 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; } }