From: Howard Chu Date: Tue, 13 Nov 2007 01:35:58 +0000 (+0000) Subject: Eliminate unnecessary Op copies X-Git-Tag: OPENLDAP_REL_ENG_2_4_9~20^2~433 X-Git-Url: https://git.sur5r.net/?a=commitdiff_plain;h=d3531c6d79a5ef7108bebe71bd60bb796cf47bba;p=openldap Eliminate unnecessary Op copies --- diff --git a/servers/slapd/overlays/translucent.c b/servers/slapd/overlays/translucent.c index 4d100c166e..a525ce45e8 100644 --- a/servers/slapd/overlays/translucent.c +++ b/servers/slapd/overlays/translucent.c @@ -282,7 +282,11 @@ static int translucent_modrdn(Operation *op, SlapReply *rs) { op->o_bd->bd_info = (BackendInfo *) on; return(rs->sr_err); } - if(!ov->no_glue) glue_parent(op); + if(!ov->no_glue) { + op->o_tag = LDAP_REQ_ADD; + glue_parent(op); + op->o_tag = LDAP_REQ_MODRDN; + } return(SLAP_CB_CONTINUE); } @@ -327,13 +331,13 @@ translucent_tag_cb( Operation *op, SlapReply *rs ) static int translucent_modify(Operation *op, SlapReply *rs) { SlapReply nrs = { REP_RESULT }; - Operation nop = *op; slap_overinst *on = (slap_overinst *) op->o_bd->bd_info; translucent_info *ov = on->on_bi.bi_private; Entry *e = NULL, *re = NULL; Attribute *a, *ax; Modifications *m, **mm; + BackendDB *db; int del, rc, erc = 0; slap_callback cb = { 0 }; @@ -352,14 +356,15 @@ static int translucent_modify(Operation *op, SlapReply *rs) { ** */ - nop.o_bd = &ov->db; - rc = ov->db.bd_info->bi_entry_get_rw(&nop, &nop.o_req_ndn, NULL, NULL, 0, &re); + db = op->o_bd; + op->o_bd = &ov->db; + rc = ov->db.bd_info->bi_entry_get_rw(op, &op->o_req_ndn, NULL, NULL, 0, &re); if(rc != LDAP_SUCCESS || re == NULL ) { - send_ldap_error((&nop), rs, LDAP_NO_SUCH_OBJECT, + send_ldap_error((op), rs, LDAP_NO_SUCH_OBJECT, "attempt to modify nonexistent local record"); return(rs->sr_err); } - nop = *op; + op->o_bd = db; /* ** fetch entry from local backend; ** if it exists: @@ -413,9 +418,11 @@ static int translucent_modify(Operation *op, SlapReply *rs) { erc = SLAP_CB_CONTINUE; release: if(re) { - if(ov->db.bd_info->bi_entry_release_rw) - ov->db.bd_info->bi_entry_release_rw(&nop, re, 0); - else + if(ov->db.bd_info->bi_entry_release_rw) { + op->o_bd = &ov->db; + ov->db.bd_info->bi_entry_release_rw(op, re, 0); + op->o_bd = db; + } else entry_free(re); } op->o_bd->bd_info = (BackendInfo *) on->on_info; @@ -432,9 +439,11 @@ release: /* don't leak remote entry copy */ if(re) { - if(ov->db.bd_info->bi_entry_release_rw) - ov->db.bd_info->bi_entry_release_rw(&nop, re, 0); - else + if(ov->db.bd_info->bi_entry_release_rw) { + op->o_bd = &ov->db; + ov->db.bd_info->bi_entry_release_rw(op, re, 0); + op->o_bd = db; + } else entry_free(re); } /* @@ -495,28 +504,28 @@ release: ber_dupbv( &e->e_nname, &op->o_req_ndn ); e->e_attrs = a; - nop.o_tag = LDAP_REQ_ADD; - nop.oq_add.rs_e = e; - - glue_parent(&nop); - + op->o_tag = LDAP_REQ_ADD; cb.sc_response = translucent_tag_cb; cb.sc_private = op->orm_modlist; - cb.sc_next = nop.o_callback; - nop.o_callback = &cb; - rc = on->on_info->oi_orig->bi_op_add(&nop, &nrs); - if ( nop.ora_e == e ) + op->oq_add.rs_e = e; + + glue_parent(op); + + cb.sc_next = op->o_callback; + op->o_callback = &cb; + rc = on->on_info->oi_orig->bi_op_add(op, &nrs); + if ( op->ora_e == e ) entry_free( e ); return(rc); } static int translucent_compare(Operation *op, SlapReply *rs) { - Operation nop = *op; slap_overinst *on = (slap_overinst *) op->o_bd->bd_info; translucent_info *ov = on->on_bi.bi_private; AttributeAssertion *ava = op->orc_ava; Entry *e; + BackendDB *db; int rc; Debug(LDAP_DEBUG_TRACE, "==> translucent_compare: <%s> %s:%s\n", @@ -527,14 +536,11 @@ static int translucent_compare(Operation *op, SlapReply *rs) { ** CONTINUE and let it do the compare; ** */ - op->o_bd->bd_info = (BackendInfo *) on->on_info; - rc = be_entry_get_rw(op, &op->o_req_ndn, NULL, ava->aa_desc, 0, &e); + rc = overlay_entry_get_ov(op, &op->o_req_ndn, NULL, ava->aa_desc, 0, &e, on); if(e && rc == LDAP_SUCCESS) { - be_entry_release_r(op, e); - op->o_bd->bd_info = (BackendInfo *) on; + overlay_entry_release_ov(op, e, 0, on); return(SLAP_CB_CONTINUE); } - op->o_bd->bd_info = (BackendInfo *) on; if(ov->defer_db_open) { send_ldap_error(op, rs, LDAP_UNAVAILABLE, @@ -546,9 +552,11 @@ static int translucent_compare(Operation *op, SlapReply *rs) { ** return the result; ** */ - nop.o_bd = &ov->db; - nop.o_callback = NULL; - rc = ov->db.bd_info->bi_op_compare(&nop, rs); + db = op->o_bd; + op->o_bd = &ov->db; + op->o_callback = NULL; + rc = ov->db.bd_info->bi_op_compare(op, rs); + op->o_bd = db; return(rc); } @@ -672,8 +680,9 @@ static int translucent_search(Operation *op, SlapReply *rs) { static int translucent_bind(Operation *op, SlapReply *rs) { slap_overinst *on = (slap_overinst *) op->o_bd->bd_info; - Operation nop = *op; translucent_info *ov = on->on_bi.bi_private; + BackendDB *db; + int rc; Debug(LDAP_DEBUG_TRACE, "translucent_bind: <%s> method %d\n", op->o_req_dn.bv_val, op->orb_method, 0); @@ -683,8 +692,11 @@ static int translucent_bind(Operation *op, SlapReply *rs) { "remote DB not available"); return(rs->sr_err); } - nop.o_bd = &ov->db; - return (ov->db.bd_info->bi_op_bind(&nop, rs)); + db = op->o_bd; + op->o_bd = &ov->db; + rc = ov->db.bd_info->bi_op_bind(op, rs); + op->o_bd = db; + return rc; } /*