/* seqmod.c - sequenced modifies */
/* This work is part of OpenLDAP Software <http://www.openldap.org/>.
*
- * Copyright 2004 The OpenLDAP Foundation.
+ * Copyright 2004-2014 The OpenLDAP Foundation.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
#include "portable.h"
-#define SLAPD_OVER_SEQMOD SLAPD_MOD_STATIC
-
#ifdef SLAPD_OVER_SEQMOD
#include "slap.h"
+#include "config.h"
/* This overlay serializes concurrent attempts to modify a single entry */
static int
seqmod_op_cleanup( Operation *op, SlapReply *rs )
{
- seqmod_info *sm = op->o_callback->sc_private;
- modtarget *mt;
+ slap_callback *sc = op->o_callback;
+ seqmod_info *sm = sc->sc_private;
+ modtarget *mt, mtdummy;
Avlnode *av;
+ mtdummy.mt_op = op;
/* This op is done, remove it */
ldap_pvt_thread_mutex_lock( &sm->sm_mutex );
- av = avl_find( sm->sm_mods, mt, sm_avl_cmp );
- assert(av);
+ av = avl_find2( sm->sm_mods, &mtdummy, sm_avl_cmp );
+ assert(av != NULL);
mt = av->avl_data;
avl_delete( &sm->sm_mods, mt, sm_avl_cmp );
}
ldap_pvt_thread_mutex_unlock( &sm->sm_mutex );
- op->o_callback = op->o_callback->sc_next;
- op->o_tmpfree( op->o_callback, op->o_tmpmemctx );
+ op->o_callback = sc->sc_next;
+ op->o_tmpfree( sc, op->o_tmpmemctx );
return 0;
}
* near-simultaneous mods of the same entry
*/
ldap_pvt_thread_mutex_lock( &sm->sm_mutex );
- av = avl_find( sm->sm_mods, mt, sm_avl_cmp );
+ av = avl_find2( sm->sm_mods, mt, sm_avl_cmp );
if ( av ) {
modtarget *mtp = av->avl_data;
mtp->mt_tail->mt_next = mt;
static int
seqmod_db_open(
- BackendDB *be
+ BackendDB *be,
+ ConfigReply *cr
)
{
slap_overinst *on = (slap_overinst *)be->bd_info;
static int
seqmod_db_close(
- BackendDB *be
+ BackendDB *be,
+ ConfigReply *cr
)
{
slap_overinst *on = (slap_overinst *)be->bd_info;
ldap_pvt_thread_mutex_destroy( &sm->sm_mutex );
ch_free( sm );
+ on->on_bi.bi_private = NULL;
}
return 0;
static slap_overinst seqmod;
int
-seqmod_init()
+seqmod_initialize()
{
seqmod.on_bi.bi_type = "seqmod";
seqmod.on_bi.bi_db_open = seqmod_db_open;
int
init_module( int argc, char *argv[] )
{
- return seqmod_init();
+ return seqmod_initialize();
}
#endif /* SLAPD_OVER_SEQMOD == SLAPD_MOD_DYNAMIC */